前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023年9月19日 Go生态洞察:修复Go 1.22中的For循环问题

2023年9月19日 Go生态洞察:修复Go 1.22中的For循环问题

作者头像
猫头虎
发布2024-04-08 15:22:55
1230
发布2024-04-08 15:22:55
举报

2023年9月19日 Go生态洞察:修复Go 1.22中的For循环问题

🐾 摘要 大家好,我是猫头虎博主,在这篇文章中,我们将深入探讨Go语言即将到来的一个重大更新——Go 1.22中的for循环作用域变化。如果你是Go开发者,这个变化对你来说意义重大。接下来,让我们一起潜入这个话题的深海,探索其细节和影响!

🐾 引言 在Go语言的世界里,for循环一直是编写代码时的基础。但正如许多Go开发者所知,现行的for循环作用域设定容易导致错误。幸运的是,Go 1.22将带来一个重要的变化,以解决这个长期存在的问题。


🐾 正文内容

🐈 Go 1.21预览:for循环作用域变更

Go 1.21版引入了一个预览变更,这是计划在Go 1.22中正式推出的。这个变更将解决for循环中引用变量超出其迭代范围的问题,这是Go中一个非常常见的错误。

示例代码分析

考虑以下Go程序:

代码语言:javascript
复制
func main() {
    done := make(chan bool)

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

    for _ = range values {
        <-done
    }
}

在这个例子中,由于所有创建的goroutine都打印相同的变量v,因此它们通常会输出“c”、“c”、“c”,而不是按某种顺序打印“a”、“b”和“c”。

生产问题案例

这种错误在实际生产中造成了问题,例如在Let’s Encrypt的一个公开文档问题中就出现了这种情况。

🐈 解决方案:Go 1.22的改进

Go 1.22计划改变for循环的行为,使这些变量在每次迭代时拥有独立的作用域,而不是整个循环的作用域。这一改变将解决上述示例中的问题,结束由此类错误导致的生产问题,并消除了对不精确工具的依赖。

向后兼容

为确保与现有代码的向后兼容性,新的语义只适用于在其go.mod文件中声明了go 1.22或更高版本的模块中包含的包。

🐈 预览修复

Go 1.21包含了作用域变更的预览。通过设置环境变量GOEXPERIMENT=loopvar,可以将新的语义应用于所有循环。

修复测试中的Bug

在准备这次切换过程中,我们必须纠正许多测试中的错误,例如下面这个测试:

代码语言:javascript
复制
func TestAllEvenBuggy(t *testing.T) {
    testCases := []int{1, 2, 4, 6}
    for _, v := range testCases {
        t.Run("sub", func(t *testing.T) {
            t.Parallel()
            if v&1 != 0 {
                t.Fatal("odd v", v)
            }
        })
    }
}

这个测试在Go 1.21中通过了,但实际上它应该失败,因为1不是偶数。修复for循环暴露了这类错误的测试。

🐈 更多信息

有关此变更的更多信息,请参阅设计文档FAQ


🐾 总结

总的来说,Go 1.22中的for循环作用域变更是对Go生态的一次重要优化。这个变化不仅解决了一个常见的编码陷阱,还有助于提高代码的整体质量。感谢您阅读这篇由猫头虎的Go生态洞察专栏收录的文章,详情点击这里

关键点

描述

for循环作用域问题

在Go中,for循环变量的作用域容易导致错误

Go 1.21预览

引入了for循环作用域变更的预览

Go 1.22变更

计划将for循环变量的作用域设为每次迭代

向后兼容性

只适用于声明了go 1.22或更高版本的模块

改进的测试

修复了由于作用域问题导致的测试错误

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2023年9月19日 Go生态洞察:修复Go 1.22中的For循环问题
    • 🐾 正文内容
      • 🐈 Go 1.21预览:for循环作用域变更
      • 🐈 解决方案:Go 1.22的改进
      • 🐈 预览修复
      • 🐈 更多信息
    • 🐾 总结
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档