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

前言

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

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

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

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

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

在 Go 1.22 版本之前,for 循环声明的变量只创建一次,并在每次迭代中更新。在 Go 1.22中,循环的每次迭代都会创建新变量,这将会避免意外的共享错误发生。

通过相同的代码示例在不同 Go 版本中运行,我们可以清楚地看到运行结果之间的区别,从而感受到语言更新带来的具体影响。

  • Go 1.21 版本的代码示例

    go 复制代码
    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
            }
    }

    代码运行结果如下所示:

    bash 复制代码
    yong
    yong
    yong

    在 for 循环体里,匿名函数与循环变量 v 形成了闭包。闭包捕获了 v 的引用(或说地址),这导致所有的闭包实例在访问 v 时实际上都访问的是同一个内存地址。由于 v 只创建一次,并且每次迭代都会更新。因此最终的打印结果都是同一个值 yong。

  • Go 1.22 版本代码示例

    go 复制代码
    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
            }
    }

    代码运行结果如下所示:

    bash 复制代码
    yong
    ming
    chen

    在 Go 1.22中,循环的每次迭代都会创建新变量 v,这意味着每个闭包都持有对不同 v 变量的引用,因此,最终打印的结果将各不相同。

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

循环支持对整数范围进行迭代

在 Go 1.22 版本之前,当我们使用 for range 时,仅支持 array or slice、string、map 和 channel 类型的表达式进行迭代,而自 Go 1.22 版本起,额外新增对 interger 类型的支持,这意味着我们能够直接使用整数进行循环迭代。

go 复制代码
package main

import "fmt"

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

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

小结

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

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

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

相关推荐
团子哒哒14 分钟前
数组、切片和Map
后端
专注仿真22 分钟前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷35 分钟前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m5555555537 分钟前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
易小尊38 分钟前
我的模型在 65% 以上时准得可怕,在 50% 时像在掷硬币
后端
用户27886072856738 分钟前
fallback 会盖掉平台提示词:system、空数组和 systemAppend 的差别
前端·后端
iOS开发上架哦39 分钟前
iOS应用耗电测试:使用Energy Log、Keymob和Instruments进行性能监控与能源消耗分析
后端·ios
掘金挖土1 小时前
前端手摸手跑路之 AI 应用开发(十一)
前端·后端
用户9888321871741 小时前
从“限流数字”到可维护策略:ASP.NET Core 固定窗口限流的落地边界
后端
IT_陈寒1 小时前
Vue动态组件缓存的坑你踩过了吗?
前端·人工智能·后端