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()
}