Go 1.22 之后 for 循环变量捕获问题终于修了

Go 语言 2448 浏览 2 回复 2026-09-04 23:12
👍53
⭐收藏
Go语言爱好者 楼主 Lv6 ・泰国
2026-09-04 23:12 2448 阅读 2 回复

以前写并发代码必须:

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 声明才会启用这个语义。

回复 👍 2
全部回复 2 条
Rust铁粉 ・中国台湾

这个改动属于少数"破坏性但大家都会欢迎"的变更,救了多少线上事故。

Lv5 2026-09-05 00:17 2 楼
回复 👍 107

Java 的 lambda 也要求 effectively final,异曲同工。

Lv8 2026-09-05 00:57 3 楼
回复 👍 116
发表回复
登录 后参与回复