Loops 在循环迭代器变量上使用goroutines

Loops 在循环迭代器变量上使用goroutines,loops,go,Loops,Go,我读到循环迭代器上的goroutines经常导致每次迭代都使用循环赋值中的最后一个值。例如 但是,这种情况是否只发生在闭包中,例如匿名函数 我似乎无法用这个例子再现这个问题 当我使用这样的匿名函数时,它会重新创建问题 但是,这是否只是闭包的问题,例如匿名函数 对。两者的区别 go speak(c) 及 即,前者调用speak,并在新的goroutine中使用c的值。然而,在后一种情况下,匿名函数捕获的不是变量c的值,而是变量c本身(通过引用\),并且在稍后的某个时间点,调用speak,使用c在

我读到循环迭代器上的goroutines经常导致每次迭代都使用循环赋值中的最后一个值。例如

但是,这种情况是否只发生在闭包中,例如匿名函数

我似乎无法用这个例子再现这个问题

当我使用这样的匿名函数时,它会重新创建问题

但是,这是否只是闭包的问题,例如匿名函数

对。两者的区别

go speak(c)

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


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

这不是问题,而是它的行为方式(它是故意这样设计的)。在你的特殊情况下,这对你来说是否是一个“问题”,只有你能说。我应该说行为而不是问题——我编辑它是为了让它更清楚,这不是一个“问题”,而是我对行为的误解。
go func() {
    speak(c)
}()