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

 更新时间:2024年02月10日 08:55:22   作者:陈明勇  
这篇文章主要详细介绍了Go 1.22 for循环的两处重要更新,Go 1.22 版本于 2024 年 2 月 6 日发布,引入了几个重要的特性和改进,在语言层面上,这个版本对 for 循环进行了两处更新,本文将会对 for 循环的两个更新进行介绍,需要的朋友可以参考下

Go 1.22 版本于 202426 日发布,引入了几个重要的特性和改进。在语言层面上,这个版本对 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 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 循环的灵活性,使得编写计数循环更加直接和简洁。

到此这篇关于详解Go 1.22 for循环的两处重要更新的文章就介绍到这了,更多相关Go 1.22 for循环更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在ubuntu下构建go语言开发环境的方法

    在ubuntu下构建go语言开发环境的方法

    这篇文章主要介绍了在ubuntu下构建go语言开发环境的方法,需要的朋友可以参考下
    2014-10-10
  • 5个可以在Golang中优化代码以提高性能的技巧分享

    5个可以在Golang中优化代码以提高性能的技巧分享

    作为一名软件工程师,确保你的代码高效且性能良好是非常重要的。本文主要和大家分享5个可以在Golang中优化代码以提高性能的技巧,希望对大家有所帮助
    2023-03-03
  • Golang使用crypto/ed25519实现数字签名和验证

    Golang使用crypto/ed25519实现数字签名和验证

    本文将深入探讨如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证,我们将从基本原理开始,逐步引导读者了解生成密钥对、进行数字签名,以及验证签名的具体过程,希望对大家有所帮助
    2024-02-02
  • Go语言题解LeetCode1266访问所有点的最小时间示例

    Go语言题解LeetCode1266访问所有点的最小时间示例

    这篇文章主要为大家介绍了Go语言题解LeetCode1266访问所有点的最小时间示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 一文搞懂Go语言中defer关键字的使用

    一文搞懂Go语言中defer关键字的使用

    defer是golang中用的比较多的一个关键字,也是go面试题里经常出现的问题。今天就来整理一下关于defer的学习使用,希望对需要的朋友有所帮助
    2022-09-09
  • Go批量操作excel导入到mongodb的技巧

    Go批量操作excel导入到mongodb的技巧

    这篇文章主要介绍了Go批量操作excel导入到mongo,包括选择命令行包,读取配置连接数据库的方法,本文示例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 一文带你了解Go语言中接口的使用

    一文带你了解Go语言中接口的使用

    这篇文章主要和大家分享一下Go语言中的接口的使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
    2022-12-12
  • 详解Go语言中切片的长度与容量的区别

    详解Go语言中切片的长度与容量的区别

    切片可以看成是数组的引用,切片的长度是它所包含的元素个数。切片的容量是从它的第一个元素到其底层数组元素末尾的个数。本文将通过示例详细讲讲Go语言中切片的长度与容量的区别,需要的可以参考一下
    2022-11-11
  • golang实现页面静态化操作的示例代码

    golang实现页面静态化操作的示例代码

    这篇文章主要介绍了golang实现页面静态化操作的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 利用go语言判断是否是完全二叉树

    利用go语言判断是否是完全二叉树

    这篇文章主要介绍了利用go语言判断是否是完全二叉树,当一个节点存在右子节点但是不存在左子节点这颗树视为非完全二叉树,通过利用GO语言判断来判断出否是完全二叉树,详细内容参考如下
    2022-05-05

最新评论