2 回答
TA贡献1842条经验 获得超12个赞
要修复:
for _, out := range outs { wg.Add(1) out := out // <- add this
为什么?
https://golang.org/doc/effective_go 是一个很好的资源,涵盖了通道部分末尾的确切关闭错误(@JimB提到):
写起来可能看起来很奇怪
要求 := 要求
但它是合法的和惯用语在Go中这样做。您将获得具有相同名称的变量的新版本,故意在局部隐藏循环变量,但对于每个 goroutine 是唯一的。
TA贡献1744条经验 获得超4个赞
您的问题在下面的代码中,for 函数中的循环。fanIn
for _, out := range outs {
wg.Add(1)
go func() {
for result := range out {
merge <- result
}
wg.Done()
}()
}
这样做的原因是你在gofunc中使用迭代器变量,当gofunc要使用它时,循环就走到了它的尽头。out
这在子主题下的 go/wiki/常见错误中进行了描述Using goroutines on loop iterator variables
有关更多示例 - 请阅读此
校正后的循环应如下所示,
for _, out := range outs {
wg.Add(1)
go func(c <- chan int) {
for result := range c {
merge <- result
}
wg.Done()
}(out)
}
- 2 回答
- 0 关注
- 68 浏览
添加回答
举报