Go1.22 计划修复for循环(目前为1.21)
- 以前的版本中,下面的示例我们可能会期望看到 a、b、c 作为输出。 但是可能会看到的是 c,c,c。 这是因为循环的每次迭代都使用变量 v 的相同实例,因此每个闭包共享该单个变量。 当闭包运行时,它会打印执行 fmt.Println 时 v 的值,但自 goroutine 启动以来 v 可能已被修改。
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v) //c c c
done <- true
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}
- 在1.21中,开启
GOEXPERIMENT=loopvar
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v) // a b c(顺序不固定,但是会是a b c 各出现一遍)
done <- true
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}