已关闭,此问题需要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)
}()
}
}
}
}
我是否应该将req
和tag
变量传递到每个闭包中,以便应用这些变量中的更改?
IMO,req
变量在调用do
函数时使用,因此没有必要,并且在for循环内的每次迭代时都会创建tag
值,这与for循环内的service
变量相同。
我不确定是否应该传递这些变量。我无法测试代码。
1条答案
按热度按时间shyt4zoc1#
req
作为参数传入函数,因此指针req
不会改变。对于req
的内容来说,这并不是说。据我所知,req
在goroutines中使用的唯一部分是req.Addr
字段。如果该字段没有更新,那么就req
而言,代码是安全的。tag
在for循环的每次迭代中都被重新定义,并被闭包捕获。这意味着,tag
逃逸到heap,tag
的新示例将被分配给每次迭代,闭包的每个示例将获得tag
的正确示例。所以你不需要把tag
作为参数传递给goroutine。