在循环迭代器变量上使用 goroutine

sag*_*r89 4 loops go

我读到循环迭代器上的 goroutine 通常会导致每次迭代都使用循环赋值中的最后一个值。例如https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables

但是,这只发生在闭包中,例如使用匿名函数吗?

我似乎无法通过此示例重现问题https://play.golang.org/p/lpZ-yD1mHu

当我使用这样的匿名函数时,它会重新创建问题https://play.golang.org/p/mDa0Z6mUP8

tka*_*usl 5

\n

然而,这只是闭包的问题吗,例如匿名函数?

\n
\n\n

是的。和...之间的不同

\n\n
go speak(c)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
go func() {\n    speak(c)\n}()\n
Run Code Online (Sandbox Code Playgroud)\n\n

也就是说,前者在新的 goroutine 中使用 的speak进行调用。然而,在后一种情况下,匿名函数捕获的不是变量的值,而是变量本身(通过引用\xc2\xb9),并且在稍后的某个时间点,使用此时具有的任何值进行调用。cccspeakc

\n\n

\xc2\xb9:golang 中没有“引用”,我不确定这是如何具体实现的,但就好像它们引用了原始变量。

\n