【发布时间】:2014-03-16 08:41:36
【问题描述】:
我很困惑为什么下面的代码没有打印出迭代值。
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
【问题讨论】:
我很困惑为什么下面的代码没有打印出迭代值。
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
【问题讨论】:
您够程不捕获变量的当前值i和v,而是他们引用变量本身。在这种情况下,5个人丁够程并没有获得计划,直到for循环完成,因此所有打印出来i最后的价值观和v。 P>
如果你想捕捉一些变量的gouroutine的当前值,您可以修改代码来读取像下面这样: P>
go func(i, v int){
fmt.Println(i,v)
}(i, v)
现在每个gouroutine有它自己的在它衍生出的时间保持的值的变量的副本。 P>
【讨论】: