Go 1.22 给 for
循环带来了一些重要更新。主要有两点值得注意:
首先,循环变量不再共享了。这解决了一个老大难问题 - 在循环里启动 goroutine 时可能出现的诡异行为。以前,我们可能会遇到所有 goroutine 打印同一个值的情况,因为它们都引用了同一个变量。现在每次迭代都会创建新的变量实例,所以这个问题就不存在了。
举个例子:
values := []int{1, 2, 3}
for i := range values {
go func() {
fmt.Println(i)
}()
}
在旧版本中,这段代码可能会打印出三个相同的数字。但在 Go 1.22 中,它会如我们所期望的那样,打印出 1、2、3(虽然顺序可能是随机的)。
其次,Go 1.22 简化了整数范围的迭代。以前我们可能会这么写:
for i := 0; i < 10; i++ { // 在 Go 1.22 之前,我们需要手动管理索引 i // 现在可以直接使用这个形式来迭代整数范围 }
现在可以更简洁地表达:
for i := range 0..10 { // Go 1.22 允许直接迭代从 0 到 10 的整数范围 }
这样写更直观,也更不容易出错,也能大大提高代码的可读性和安全性。不过也别担心,旧的写法还是能用的,编译器不会把你的老代码搞坏。