大家好,我是煎鱼。又过了好几个月,到了 Go 新版本的日子了。Go 1.22 预计将于 2024 年 2 月发布。我将会给大家带来一系列的新版本特性讲解和分享。今天这篇文章主要是针对 for 循环的特性变更。不再共享循环变量在老版本的 Go 中,for 循环迭代器的变量是一个单一变量,在每个循环迭代中仅是取值不同。这样做在性能上非常高效,但如果使用不当,会导致意想不到的行为,可能会造成共享循环变量的问题。最经典的场景就是在 goroutine 循环时的问题。如下代码:func main() {
values := []int{1, 2, 3, 4, 5}
for _, val := range values {
go func() {
fmt.Printf("%d ", val)
}()
}
time.Sleep(time.Second * 3)
}输出结果:5 5 5 5 5如果是 Go1.22 以前的版本,在不做任何变更的情况下。我们需要把代码改成如下:func main() {
values := []int{1, 2, 3, 4, 5}
for _, val := range values {
go func(val int) {
...
继续阅读
(74)