2 回答
TA貢獻1842條經驗 獲得超13個贊
要修復:
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 關注
- 100 瀏覽
添加回答
舉報
