Go 去等群体行为不明显
我不明白为什么这个代码返回 三 三 三Go 去等群体行为不明显,go,Go,我不明白为什么这个代码返回 三 三 三 请解释任何人将v:=v添加为循环中的第一行 : 这是因为循环的每次迭代都使用变量v[…]的相同实例 因为v被重新用于。。。range来存储数据,因此当您的goroutine最终调用fmt.Println时,它们拥有循环的最后一个值。您可以通过显式地将循环中的v复制到新变量来解决此问题。(通过将变量作为arg传递给goroutine来复制该变量)仅供我理解:请有人解释一下为什么这是被否决的?我不是被否决的投票人,但我猜这是因为通常不建议使用阴影。将v分配给一
请解释任何人将
v:=v
添加为循环中的第一行
:
这是因为循环的每次迭代都使用变量v[…]的相同实例
因为
v
被重新用于。。。range
来存储数据,因此当您的goroutine最终调用fmt.Println时,它们拥有循环的最后一个值。您可以通过显式地将循环中的v
复制到新变量来解决此问题。(通过将变量作为arg传递给goroutine来复制该变量)仅供我理解:请有人解释一下为什么这是被否决的?我不是被否决的投票人,但我猜这是因为通常不建议使用阴影。将v
分配给一个新变量,并在匿名函数中使用该变量,或将范围的索引分配给一个变量,并直接访问该值(即数据[i]
)两者都可能是更好的解决方案。另一种选择是将v
作为参数传递给匿名函数。@TravisHegner:v:=v
模式非常好,列在常见问题解答中,熟悉围棋的人都应该能识别。我认为这里的问题可能是答案开始时只有一个链接,没有解释,仍然没有提供链接内容的真正附加价值。
package main
import (
"fmt"
"sync"
)
func main() {
wg := sync.WaitGroup{}
data := []string{"one", "two", "three"}
for _, v := range data {
wg.Add(1)
go func() {
fmt.Println(v)
wg.Done()
}()
}
wg.Wait()
}