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


数据技术都能四世同堂,凭什么开发 30 岁就要被干掉?

上月正式发布的 Go 1.21 修改了 for 循环变量的语义(预览阶段,点此查看详情)。

现在,Go 团队表示 Go 1.22 会将这项特性发布为正式功能

根据 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 下默认启用。


相關推薦

2022-08-20

入通用并行任务运行时之前,Julia 就有了用于并行化 for 循环的 @threads 宏。 由于这个历史原因,@threads 一直提供静态调度,以避免意外依赖这种严格行为而破坏程序。 为了多任务系统能更好工作, Julia 1.5 中引入了 :static 调度

2023-01-24

持泛型/实例的代码完成,查找和重构支持。 * 改进环境变量,编辑器,代码完成和集成终端等插件。 * 支持 VS2019 和 FreeBSD/OpenBSD 编译。   ### 2023.01.22 Ver X38.1 * LiteIDE * gotools & gocode support Go1.18 generics * support build for windows v

2022-02-28

orvalds 递交的补丁 (Proposal for speculative safe list iterator) 中修复了内核链表相关的预测执行漏洞。 起因是 Jakob 发现了一个问题,Linux 内核广泛使用由 struct list_head 定义的双向链表: struct list_head { struct list_head *next, *prev; };

2023-02-01

22 版本作为一个主要版本带来了许多改进、新功能和错误修复,为用户提供一流的多媒体体验。 亮点 AV1 视频编解码器支持的改进 新的 HLS、DASH 和 Microsoft Smooth Streaming 自适应流媒体客户端 Qt6 支持在 QML 场景中渲染视频

2022-05-20

会检查整个项目,包括所有依赖项。如果依赖项包含类型错误,则会进行反馈。 Local:局部类型检查模式(local type checking)会检查项目中的代码是否存在类型错误,但不针对所有依赖项进行类型检查。 None:不执行类型检查

2023-11-23

和商用. 本次更新 新增(menu): 新增 path 的校验规则 修复(icon): 修复 icon 组件的循环依赖问题 升级(tinymce): 升级 Tinymce 至最新,优化夜间模式下的样式 优化(i18n): 优化 i18n 翻译 新增(ImageUpload):新增 ImageUpload 组件 优化:

2023-06-07

#42432 优化 ColorPicker 组件在暗黑模式下的样式。#42827 修复 Popconfirm、Alert 和 Notification 组件 colorTextHeading 和 colorText 误用问题。#42839 修复 Divider 组件的样式问题。#42797 修复 Image.PreviewGroup 预览时图片切换后状

2022-10-26

”。现在对编译器的贡献已经变得更容易了。 新的 for 循环语法 一个例子是即将实现的新 for 循环语法,它也支持 ranges。不过值得注意的是,这不会包含在 0.10.0 版本中。 const nums = [3]usize {42, 42, 42}; const chars = [3]u8 {'a',

2023-09-06

为枚举值 禁止使用未初始化的函数指针 使用默认 expr 修复匿名结构 支持使用 const 作为枚举值 禁止将静态函数声明为方法接收者 (method receivers) 修复for i++; i<10; i++ { 详情查看 release notes。 V 是一个集合了 Go 的简单

2023-01-12

(MAS) 启用外部卷访问的额外步骤和信息 (MAS) 小的错误修复 翻译 更新了简体中文、俄语、越南语、乌克兰语、法语翻译 平台 新推出了 Keka for iOS 版本(售价 $3.99) 更多详情可查看:https://github.com/aonez/Keka/releases

2022-06-08

Storm 能够检测可以优化in_array()或array_key_exists()调用的 for 循环。 不明确时,将变量名称添加到 @var 和 @param 文档块 有时 PhpStorm 无法确定 @var 或 @param docblock 引用哪个变量,该版本添加了一个检查功能,以轻松地指向正确的

2022-05-13

来了对 Kubernetes 1.22 的支持。 此版本还有许多重要的错误修复,包括: 修复了将健康的 pod 标记为不健康的健康控制器竞争条件。 在缩放之前检查 fleet 和游戏服务器集的 DeletionTimestamp。 GameServer 卡在关闭状态,阻止滚动

2023-01-19

com/gogf/gf/tree/master/contrib/registry/zookeeper 数据库驱动 修复clickhouse在配置Charset参数时的报错问题。 改进clickhouse获取数据表结构结果,返回的Index顺序统一从0开始。 改进oracle表结构获取SQL,以支持float64数据类型。 修复pg

2022-11-08

版已经发布,因此也已经停止添加新的功能,正集中精力修复错误,为 12 月初的主要版本做好准备。 性能改进 改变 'go list' 以改善索引 打开时从缓存中恢复项目结构 更快的 IDE 启动和项目打开 泛型 现在可以为具有