我正在根据迭代变量在 goroutine 内部进行一些条件检查i,发现它给了我意想不到的结果,我决定用一些简单的代码来确认它。 for i := 1; i <= 5; i++ { wg.Add(1) fmt.Println(i) go func() { fmt.Println(i) wg.Done() }()}wg.Wait()1234566666这是预期的行为吗?有人可以解释为什么 6 被打印 5 次,尽管我只迭代到 5 吗?
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
在你的 for 循环完成后,你所有的 goroutine 都在异步运行。
在你的 for 循环结束时i等于 6,因此,你的 goroutine 每个都记录数字 6。
要解决这个问题,您可以创建一个闭包,并在其中保存当前的值,i以便当 goroutine 运行时,它会以正确的值运行i。
为此,只需更改您的代码,使其看起来像
go func(x int) {
fmt.Println(x)
wg.Done()
}(i) // <--- "save" value of i at this point in time.
这样,您可以“保存”i您告诉 goroutine 执行的函数内部的值,以便稍后,当 for 循环运行完成时,它不会使用当前值为i6 的值;相反,它使用goroutine 创建时的旧值。i
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报
0/150
提交
取消