为了账号安全,请及时绑定邮箱和手机立即绑定

使用 goroutine 进行迭代会产生意想不到的结果

使用 goroutine 进行迭代会产生意想不到的结果

Go
侃侃无极 2022-01-17 10:15:34
我正在根据迭代变量在 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


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信