为什么golang在我的for循环中没有正确迭代?

时间:2014-02-17 06:49:23

标签: go goroutine

我很困惑为什么以下代码不会打印出迭代值。

test:= []int{0,1,2,3,4}
for i,v := range test{
  go func(){
    fmt.Println(i,v)
  }
}

我认为它应该打印出来

0 0
1 1
2 2
3 3 
4 4

但相反,它打印出

4 4
4 4
4 4
4 4
4 4

1 个答案:

答案 0 :(得分:9)

您的goroutine不会捕获变量iv的当前值,而是会引用变量本身。在这种情况下,5个衍生的goroutine在for循环完成之前没有安排,因此所有打印出iv的最后一个值。

如果要捕获gouroutine的某些变量的当前值,可以修改代码以读取如下内容:

go func(i, v int){
    fmt.Println(i,v)
}(i, v)

现在每个gouroutine都有自己的变量副本,并在产生时保存该值。