定了:Go 1.22将修复for循环变量错误

共 1540字,需浏览 4分钟

 ·

2023-09-26 14:39

出品 | OSC开源社区(ID:oschina2013)

上月正式发布的 Go 1.21 修改了 for 循环变量的语义( 预览阶段,详情:https://github.com/golang/go/wiki/LoopvarExperiment )。 现在,Go 团队表示 Go 1.22 会将这项特性发布为正式功能 3bf4292abb1c2e58b11147b8f3466618.webp根据 Go 开发团队技术 leader Russ Cox (rsc) 的介绍,Go 开发者经常会犯的错误是在循环迭代结束后,保留对循环变量的引用,此时它会采用预期之外的新值。 例如下面的程序:
    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
}
}

其创建的三个 goroutine 都用于打印相同的变量  v ,因此它们只会打印出 “c”, “c”, “c”,而不是按顺序打印 “a”, “b”, 和 “c”。

从 Go1.21 开始,开发者可以启用  GOEXPERIMENT=loopvar  来构建 Go 程序,以解决上文提到的 for 循环变量问题。

构建命令:

    GOEXPERIMENT=loopvar go install my/program
GOEXPERIMENT=loopvar go build my/program
GOEXPERIMENT=loopvar go test my/program
GOEXPERIMENT=loopvar go test my/program -bench=.
...
现在 Go 开发团队表示,从 Go1.22 开始,新的 for 循环语义将会在 go.mod 文件中的 Go 版本大于等于 Go1.22 下默认启用。
< END > 我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧 点击加群 ,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以 点击这里领取

推荐阅读

··································

你好,我是 JavaPub,多年开发老司机,区块链从业者、自媒体创作者、站长。喜欢自由、开放。选择计算机这个行业,就是因为热爱。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报