Loops 在循环迭代器变量上使用goroutines
我读到循环迭代器上的goroutines经常导致每次迭代都使用循环赋值中的最后一个值。例如 但是,这种情况是否只发生在闭包中,例如匿名函数 我似乎无法用这个例子再现这个问题 当我使用这样的匿名函数时,它会重新创建问题 但是,这是否只是闭包的问题,例如匿名函数 对。两者的区别Loops 在循环迭代器变量上使用goroutines,loops,go,Loops,Go,我读到循环迭代器上的goroutines经常导致每次迭代都使用循环赋值中的最后一个值。例如 但是,这种情况是否只发生在闭包中,例如匿名函数 我似乎无法用这个例子再现这个问题 当我使用这样的匿名函数时,它会重新创建问题 但是,这是否只是闭包的问题,例如匿名函数 对。两者的区别 go speak(c) 及 即,前者调用speak,并在新的goroutine中使用c的值。然而,在后一种情况下,匿名函数捕获的不是变量c的值,而是变量c本身(通过引用\),并且在稍后的某个时间点,调用speak,使用c在
go speak(c)
及
即,前者调用speak
,并在新的goroutine中使用c
的值。然而,在后一种情况下,匿名函数捕获的不是变量c
的值,而是变量c
本身(通过引用\),并且在稍后的某个时间点,调用speak
,使用c
在该时间点具有的任何值
:golang中没有“引用”,我不确定这是如何实现的,但它们好像引用了原始变量。这不是问题,而是它的行为方式(它是故意这样设计的)。在你的特殊情况下,这对你来说是否是一个“问题”,只有你能说。我应该说行为而不是问题——我编辑它是为了让它更清楚,这不是一个“问题”,而是我对行为的误解。
go func() {
speak(c)
}()