背景
go1.22版本 for loop每轮循环都生成新的变量.
原谅: https://tip.golang.org/doc/go1.22
Previously, the variables declared by a "for" loop were created once and updated by each iteration. In Go 1.22, each iteration of the loop creates new variables, to avoid accidental sharing bugs. The transition support tooling described in the proposal continues to work in the same way it did in Go 1.21.
测试
接下来将使用同样的代码, 分别使用go1.21.4和go1.22.4版本来运行:
go
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 5; i++ {
go func() {
fmt.Println(i, &i)
}()
}
time.Sleep(time.Second)
}
在我的mac 机器上, go1.21.4的运行结果(可能每次都不太一样):
$ go run main.go
5 0x14000112008
5 0x14000112008
5 0x14000112008
3 0x14000112008
5 0x14000112008
使用go1.22.4运行的结果:
$ go run main.go
0 0x14000110018
4 0x14000110038
3 0x14000110030
1 0x14000110020
2 0x14000110028
总结
go1.22版本对于for循环中的每个循环变量, 每轮循环都是都是使用新的变量.