前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 1.22 对 “for” 循环进行了两项更改

Go 1.22 对 “for” 循环进行了两项更改

作者头像
frank.
发布2024-03-12 09:43:42
1460
发布2024-03-12 09:43:42
举报

01

介绍

Go 1.22 的大部分更改都发生在工具链、运行时和库的实现中。关于语言更改,Go 1.22 对 “for” 循环进行了两项更改。

02

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

在 Go 1.22 之前,由 “for” 循环声明的变量只创建一次,并在每次迭代时更新。

示例代码:

代码语言:javascript
复制
package main

import (
 "fmt"
)

func main() {
 done := make(chan bool)

 values := []string{"a", "b", "c"}
 for _, v := range values {
  go func() {
   fmt.Println(v)
   done <- true
  }()
 }

 // wait for all goroutines to complete before exiting
 for _ = range values {
  <-done
 }
}

输出结果:

代码语言:javascript
复制
// go 1.21
c
c
c

阅读上面这段代码,由于循环变量的工作方式,在 Go 1.22 之前,在使用具有并发性的闭包时可能会出现一些混淆。

在 Go 1.21 中,我们期望输出 a、b、c,而得到的输出是 c、c、c。这是因为循环的每次迭代都使用变量 v 的相同实例,因此每个闭包共享该单个变量。

要在启动时将 v 的当前值绑定到每个闭包,必须修改内部循环以在每次迭代时创建一个新变量。

一种方法是将变量作为参数传递给闭包:

代码语言:javascript
复制
for _, v := range values {
    go func(u string) {
        fmt.Println(u)
        done <- true
    }(v)
}

在此示例中,v 的值作为参数传递给匿名函数。然后,该值可以在函数中作为变量 u 访问。

更简单的方法是创建一个新变量,使用一种声明样式,这种样式可能看起来很奇怪,但在 Go 中工作正常:

代码语言:javascript
复制
for _, v := range values {
    v := v // create a new 'v'.
    go func() {
        fmt.Println(v)
        done <- true
    }()
}

在 Go 1.22 中,“for” 循环的每次迭代都会创建新的变量,以避免意外的共享错误,从而消除了这个问题。

03

支持遍历整数

在 Go 1.22 之前,带有 “range” 子句的 “for” 语句遍历数组、切片、字符串或映射的所有条目、通道上接收的值。

在 Go 1.22 中,带有 “range” 子句的 “for” 语句支持遍历大于 0 的整数。

示例代码:

代码语言:javascript
复制
package main

import "fmt"

func main() {
  for i := range 10 {
    fmt.Println(10 - i)
  }
  fmt.Println("go1.22 has lift-off!")
}

输出结果:

代码语言:javascript
复制
10
9
8
7
6
5
4
3
2
1
go1.22 has lift-off!

04

总结

本文我们介绍 Go 1.22 关于语言的更改,即关于 for loop 进行的两项更改。

在 Go 1.21 中,已经支持 for loop 的两项更改,但是,需要设置环境变量 GOEXPERIMENT=loopvar

在 Go 1.22 中,关于 for loop 的两项更改,默认开启,不再需要设置环境变量。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档