Go 1.22 for 循环的两处重要更新

简介: 本文介绍了 Go 1.22 版本对 for 循环所做的两处重要更新:循环的每次迭代都会创建新变量 和 循环支持对整数范围进行迭代。- 循环的每次迭代都会创建新变量,有效避免了以往版本中常见的闭包陷阱,提高了代码的安全性和可预测性。- 循环支持对整数范围进行迭代,极大地增强了 for 循环的灵活性,使得编写计数循环更加直接和简洁。

前言

Go 1.22 版本于 202426 日发布,引入了几个重要的特性和改进。在语言层面上,这个版本对 for 循环进行了两处更新:

  • 循环的每次迭代都会创建新变量
  • 循环支持对整数范围进行迭代

本文将会对 for 循环的两个更新进行介绍。

准备好了吗?准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。

Go-Let'sGo.jpg

循环的每次迭代都会创建新变量

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 slicestringmapchannel 类型的表达式进行迭代,而自 Go 1.22 版本起,额外新增对 interger 类型的支持,这意味着我们能够直接使用整数进行循环迭代。

package main

import "fmt"

func main() {
   
   
    for i := range 10 {
   
   
        fmt.Println(i)
    }
}

对于整数值 10,迭代值从 09 按递增顺序生成。如果 range 后面的表达式为 0,则循环不进行任何迭代。

小结

本文介绍了 Go 1.22 版本对 for 循环所做的两处重要更新:循环的每次迭代都会创建新变量循环支持对整数范围进行迭代

  • 循环的每次迭代都会创建新变量,有效避免了以往版本中常见的闭包陷阱,提高了代码的安全性和可预测性。

  • 循环支持对整数范围进行迭代,极大地增强了 for 循环的灵活性,使得编写计数循环更加直接和简洁。

目录
相关文章
|
2月前
|
Go
go语言中在 for 循环中使用 break
go语言中在 for 循环中使用 break
50 4
|
2月前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
50 2
|
1月前
|
Go
go语言使用传统的for循环
go语言使用传统的for循环
32 7
|
1月前
|
存储 Go 索引
go语言使用for循环遍历
go语言使用for循环遍历
54 7
|
2月前
|
Go
go语言中控制循环
go语言中控制循环
41 14
|
2月前
|
Go 索引
go语音中range 循环
go语音中range 循环
49 12
|
2月前
|
测试技术 Go 索引
go语言通过 for 循环遍历
go语言通过 for 循环遍历
35 3
|
2月前
|
Go
go语言中无限循环
go语言中无限循环
45 9
|
2月前
|
Java Go
go语言中for循环
go语言中for循环
40 3
Go语言的条件控制语句及循环语句的学习笔记
本文是Go语言的条件控制语句和循环语句的学习笔记,涵盖了if语句、if-else语句、if嵌套语句、switch语句、select语句以及for循环和相关循环控制语句的使用方法。
Go语言的条件控制语句及循环语句的学习笔记