背景
go1.22版本 for loop每轮循环都生成新的变量.
原谅: https://tip.golang.org/doc/go1.22
测试
接下来将使用同样的代码, 分别使用go1.21.4和go1.22.4版本来运行:
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循环中的每个循环变量, 每轮循环都是都是使用新的变量.