我很困惑为什么以下代码不会打印出迭代值。
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
答案 0 :(得分:9)
您的goroutine不会捕获变量i
和v
的当前值,而是会引用变量本身。在这种情况下,5个衍生的goroutine在for循环完成之前没有安排,因此所有打印出i
和v
的最后一个值。
如果要捕获gouroutine的某些变量的当前值,可以修改代码以读取如下内容:
go func(i, v int){
fmt.Println(i,v)
}(i, v)
现在每个gouroutine都有自己的变量副本,并在产生时保存该值。