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 关注
- 146 浏览
添加回答
举报