2 回答

TA貢獻1802條經驗 獲得超4個贊
你已經陷入了這個陷阱:在循環迭代器變量上使用 goroutine
解決這個問題的一種方法是:
for j, fn := range fns {
fmt.Printf("fn loop %d\n", j)
wg.Add(1)
// copy the iterator variable to a local variable :
// variables declared within the body of a loop are not shared between iterations
f := fn
go ms.process(&wg, f, fnChan)
}

TA貢獻1797條經驗 獲得超4個贊
問題
你這里有一個問題:
ms.Entry = &entry
當你使用循環時,像這樣:
for i, entry := range *ms.Entries {
變量“entry”僅聲明一次。
因此&entry將有一個常數值(每次迭代中的值相同)。
但即使您解決了這個問題,另一個問題是您ms在每次迭代中都使用相同的對象。
因此,當您啟動不同的 goroutine 時,ms.Entry = ...您在第二次迭代中執行的語句將修改共享ms對象。
您還fn按照其他答案中的描述在迭代之間“共享”變量,因此您還應該捕獲該變量。
使固定
我建議您從結構中刪除該Entry字段(您不需要它,因為您已經擁有完整的數組),并使用數組位置來引用當前條目。
i int您應該向“action”和“process”函數添加一個參數。
您還需要“捕獲”fn變量。
for i, entry := range *ms.Entries {
...
for j, fn := range fns {
...
fn := fn // capture the fn variable
go ms.process(&wg, fn, fnChan, i) // sending index here
}
}
請參閱此處修改后的游樂場:
https://play.golang.org/p/uuw7r4kGBPb
- 2 回答
- 0 關注
- 184 瀏覽
添加回答
舉報