golang踩坑日记——协程在for循环里引用迭代变量
func main(){
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
fmt.Println("Ai: ", i)
wg.Done()
}()
}
wg.Wait()
}
输出结果:
Ai: 10
Ai: 10
Ai: 10
Ai: 10
Ai: 10
Ai: 10
Ai: 10
Ai: 10
Ai: 10
Ai: 10
golang中携程引用外部的变量,主协程中for循环已经执行完了,go携程才开始执行。此时,i的值已经是10了。
解决方案:
(1)给go携程传入参数i
func main(){
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println("Ai: ", i)
wg.Done()
}(i)
}
wg.Wait()
}
(2) 将i赋值给局部变量j, go携程引用每次循环生成的局部变量j
for i := 0; i < 10; i++ {
j := i
go func() {
fmt.Println("Ai: ", j)
wg.Done()
}()
}
输出结果:
Ai: 9
Ai: 0
Ai: 8
Ai: 1
Ai: 6
Ai: 7
Ai: 4
Ai: 5
Ai: 2
Ai: 3