我应该在这样的代码段中将变量传递到golang中的闭包中吗?[关闭]

chy5wohz  于 2023-05-20  发布在  Go
关注(0)|答案(1)|浏览(109)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

4天前关闭。
Improve this question

func do(req *Request) {
    server := req.Servers
    for _, s := range server.Services {
        service := s.(*devices.Service)
        if service.Needs {
    
            tag := service.Tag
            if req.VALUE != 0 {
                tag = int(req.VALUE)
            }
    
            switch req.SubActionVal {
            case joinv3:
                go func() {
                    _ = pkt(service.a, service.b, service.c,
                        service.d, service.e, service.f, service.g, tag,
                        service.k, service.s, req.addr)
                }()
            case leave:
                go func() {
                    _ = pkt(service.a, service.b, service.c,
                        service.d, service.e, service.f, service.g, tag,
                        service.k, service.s, req.addr)
                }()
                
            case join:
                go func() {
                    _ = pkt.send(service.a, service.b, service.c,
                        service.d, service.e, service.f, service.g, tag,
                        service.k, service.s, req.addr)
                }()
            }
        }
    }
}

我是否应该将reqtag变量传递到每个闭包中,以便应用这些变量中的更改?
IMO,req变量在调用do函数时使用,因此没有必要,并且在for循环内的每次迭代时都会创建tag值,这与for循环内的service变量相同。
我不确定是否应该传递这些变量。我无法测试代码。

shyt4zoc

shyt4zoc1#

req作为参数传入函数,因此指针req不会改变。对于req的内容来说,这并不是说。据我所知,req在goroutines中使用的唯一部分是req.Addr字段。如果该字段没有更新,那么就req而言,代码是安全的。
tag在for循环的每次迭代中都被重新定义,并被闭包捕获。这意味着,tag逃逸到heap,tag的新示例将被分配给每次迭代,闭包的每个示例将获得tag的正确示例。所以你不需要把tag作为参数传递给goroutine。

相关问题