详解Go 1.22 for循环的两处重要更新
作者:陈明勇
Go 1.22
版本于 2024 年 2 月 6 日发布,引入了几个重要的特性和改进。在语言层面上,这个版本对 for
循环进行了两处更新:
- 循环的每次迭代都会创建新变量
- 循环支持对整数范围进行迭代
本文将会对 for
循环的两个更新进行介绍。
准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。
循环的每次迭代都会创建新变量
在 Go 1.22
版本之前,for
循环声明的变量只创建一次,并在每次迭代中更新。在 Go 1.22
中,循环的每次迭代都会创建新变量,这将会避免意外的共享错误发生。
通过相同的代码示例在不同 Go
版本中运行,我们可以清楚地看到运行结果之间的区别,从而感受到语言更新带来的具体影响。
Go 1.21
版本的代码示例
package main import "fmt" func main() { done := make(chan bool) values := []string{"chen", "ming", "yong"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } // 结束前等待所有的 goroutine 执行成 for _ = range values { <-done } }
代码运行结果如下所示:
yong
yong
yong
在
for
循环体里,匿名函数与循环变量v
形成了闭包。闭包捕获了v
的引用(或说地址),这导致所有的闭包实例在访问v
时实际上都访问的是同一个内存地址。由于v
只创建一次,并且每次迭代都会更新。因此最终的打印结果都是同一个值yong
。Go 1.22
版本代码示例
package main import "fmt" func main() { done := make(chan bool) values := []string{"chen", "ming", "yong"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } // 结束前等待所有的 goroutine 执行成 for _ = range values { <-done } }
代码运行结果如下所示:
yong
ming
chen
在
Go 1.22
中,循环的每次迭代都会创建新变量v
,这意味着每个闭包都持有对不同v
变量的引用,因此,最终打印的结果将各不相同。循环的每次迭代都会创建新变量 的这一更新,有效避免了以往版本中常见的闭包陷阱,提高了代码的安全性和可预测性。
循环支持对整数范围进行迭代
在 Go 1.22
版本之前,当我们使用 for range
时,仅支持 array or slice
、string
、map
和 channel
类型的表达式进行迭代,而自 Go 1.22
版本起,额外新增对 interger
类型的支持,这意味着我们能够直接使用整数进行循环迭代。
package main import "fmt" func main() { for i := range 10 { fmt.Println(i) } }
对于整数值 10
,迭代值从 0
到 9
按递增顺序生成。如果 range
后面的表达式为 0
,则循环不进行任何迭代。
小结
本文介绍了 Go 1.22
版本对 for
循环所做的两处重要更新:循环的每次迭代都会创建新变量 和 循环支持对整数范围进行迭代。
循环的每次迭代都会创建新变量,有效避免了以往版本中常见的闭包陷阱,提高了代码的安全性和可预测性。
循环支持对整数范围进行迭代,极大地增强了 for
循环的灵活性,使得编写计数循环更加直接和简洁。
到此这篇关于详解Go 1.22 for循环的两处重要更新的文章就介绍到这了,更多相关Go 1.22 for循环更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!