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

我正在根据迭代变量在 goroutine 内部进行一些条件检查i,发现它给了我意想不到的结果,我决定用一些简单的代码来确认它。


    for i := 1; i <= 5; i++ {

    wg.Add(1)

    fmt.Println(i)


    go func() {

        fmt.Println(i)

        wg.Done()

    }()



}

wg.Wait()


1

2

3

4

5

6

6

6

6

6

这是预期的行为吗?有人可以解释为什么 6 被打印 5 次,尽管我只迭代到 5 吗?


侃侃无极
浏览 113回答 1
1回答

慕村9548890

在你的 for 循环完成后,你所有的 goroutine 都在异步运行。在你的 for 循环结束时i等于 6,因此,你的 goroutine 每个都记录数字 6。要解决这个问题,您可以创建一个闭包,并在其中保存当前的值,i以便当 goroutine 运行时,它会以正确的值运行i。为此,只需更改您的代码,使其看起来像go func(x int) {&nbsp; fmt.Println(x)&nbsp; wg.Done()}(i) // <--- "save" value of i at this point in time.这样,您可以“保存”i您告诉 goroutine 执行的函数内部的值,以便稍后,当 for 循环运行完成时,它不会使用当前值为i6 的值;相反,它使用goroutine 创建时的旧值。i
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go