循环中的 Golang 匿名函数 - 作为参数传递的值的问题
Golang anonymous function in loop - issues with values passed as arguments
我已经阅读了各种页面,例如 https://github.com/golang/go/wiki/CommonMistakes,其中概述了在循环中使用闭包和 goroutines 的问题。因此,我将原始循环编写如下:
for outstanding < threads {
ttl += 1;
outstanding += 1;
go func (ttl int, results chan Result) {
results <- pw.SendTTL(ttl, dest)
results <- pw.Recv(3)
}(ttl, results)
}
将不断变化的 TTL 作为参数传递给匿名函数。我最终得到了范围内的随机值。假设我期待 1-5,我会得到几个 1,几个 3,也许是 4。
所以我尝试了以下方法,以防万一有关于专门使用循环实例化的变量的事情。是的,我知道我在这里有点滥用 for 循环...
for i := ttl; outstanding < threads; i++ {
go func (ttl int, results chan Result) {
results <- pw.SendTTL(ttl, dest)
results <- pw.Recv(3)
}(i, results)
outstanding++;
}
没有快乐。同样的经历。
我还尝试了另一个建议的选项,您可以在循环中使用局部变量,并在闭包中使用它。同样的经历。
我在这里做错了什么?我错过了什么船?
在写出要求的示例时,我想我意识到了我的问题所在。尝试共享套接字时,各种 go 例程相互破坏 TTL 设置。
问题撤回;)
编辑:澄清一下,实际上在任何一种情况下都将正确的值传递给了例程。问题在于潜在的资源共享。
我已经阅读了各种页面,例如 https://github.com/golang/go/wiki/CommonMistakes,其中概述了在循环中使用闭包和 goroutines 的问题。因此,我将原始循环编写如下:
for outstanding < threads {
ttl += 1;
outstanding += 1;
go func (ttl int, results chan Result) {
results <- pw.SendTTL(ttl, dest)
results <- pw.Recv(3)
}(ttl, results)
}
将不断变化的 TTL 作为参数传递给匿名函数。我最终得到了范围内的随机值。假设我期待 1-5,我会得到几个 1,几个 3,也许是 4。
所以我尝试了以下方法,以防万一有关于专门使用循环实例化的变量的事情。是的,我知道我在这里有点滥用 for 循环...
for i := ttl; outstanding < threads; i++ {
go func (ttl int, results chan Result) {
results <- pw.SendTTL(ttl, dest)
results <- pw.Recv(3)
}(i, results)
outstanding++;
}
没有快乐。同样的经历。
我还尝试了另一个建议的选项,您可以在循环中使用局部变量,并在闭包中使用它。同样的经历。
我在这里做错了什么?我错过了什么船?
在写出要求的示例时,我想我意识到了我的问题所在。尝试共享套接字时,各种 go 例程相互破坏 TTL 设置。
问题撤回;)
编辑:澄清一下,实际上在任何一种情况下都将正确的值传递给了例程。问题在于潜在的资源共享。