以前写并发代码必须:
for _, v := range items {\n v := v // 必须重新声明\n go func() { fmt.Println(v) }()\n}Go 1.22 起,每次迭代会创建新的循环变量,上面的 v := v 可以删掉了。
不过要注意:如果代码要兼容老版本 Go,还是保留比较稳妥。另外 go.mod 里的 go 1.22 声明才会启用这个语义。
以前写并发代码必须:
for _, v := range items {\n v := v // 必须重新声明\n go func() { fmt.Println(v) }()\n}Go 1.22 起,每次迭代会创建新的循环变量,上面的 v := v 可以删掉了。
不过要注意:如果代码要兼容老版本 Go,还是保留比较稳妥。另外 go.mod 里的 go 1.22 声明才会启用这个语义。
这个改动属于少数"破坏性但大家都会欢迎"的变更,救了多少线上事故。
Java 的 lambda 也要求 effectively final,异曲同工。