Go 官方博客

Go 1.23 已发布

Dmitri Shuralyov,代表 Go 团队
2024 年 8 月 13 日

今天 Go 团队很高兴发布 Go 1.23,您可以访问下载页面获取。

如果您的机器上已经安装了 Go 1.22 或 Go 1.21,您也可以在现有模块中尝试运行 go get toolchain@go1.23.0。这将下载新的工具链,并让您立即在模块中使用它。稍后,当您准备好完全切换到 Go 1.23 并将其作为模块的最低所需 Go 版本时,您可以继续运行 go get go@1.23.0。有关此功能的更多信息,请参阅使用 go get 管理 Go 版本模块要求

Go 1.23 相对于 Go 1.22 有许多改进。一些亮点包括

语言变更

  • “for-range” 循环中的范围表达式现在可以是迭代器函数,例如 func(func(K) bool)。这支持用户定义对任意序列的迭代器。标准库中的 slicesmaps 包增加了几个与迭代器一起使用的功能,还有一个新的 iter 包。例如,如果您希望将映射 m 的键收集到一个切片中,然后对其值进行排序,您可以在 Go 1.23 中使用 slices.Sorted(maps.Keys(m)) 来实现。

    Go 1.23 还包含对泛型类型别名的预览支持。

    在发布说明中阅读更多关于语言变更迭代器的信息。

工具改进

  • 从 Go 1.23 开始,Go 工具链可以收集使用情况和故障统计信息,以帮助了解 Go 工具链的使用方式及其运行情况。这是 Go 遥测,一个选择加入系统。请考虑选择加入,以帮助我们维护 Go 的良好运行并更好地了解 Go 的使用情况。在发布说明中阅读更多关于Go 遥测的信息。
  • go 命令新增了便捷功能。例如,运行 go env -changed 可以更轻松地仅查看其有效值与默认值不同的设置,而 go mod tidy -diff 有助于确定对 go.mod 和 go.sum 文件的必要更改而无需实际修改它们。在发布说明中阅读更多关于Go 命令的信息。
  • go vet 子命令现在会报告对于目标 Go 版本来说太新的符号。在发布说明中阅读更多关于工具的信息。

标准库改进

  • Go 1.23 改进了 time.Timertime.Ticker 的实现。在发布说明中阅读更多关于计时器变更的信息。
  • Go 1.23 标准库中共有 3 个新包:iterstructsunique。上面已提到 iter 包。structs 包定义了标记类型来修改结构体的属性。unique 包提供了规范化(“interning”)可比较值的功能。在发布说明中阅读更多关于新的标准库包的信息。
  • 发布说明的库的次要变更部分列出了标准库的许多改进和新增内容。“Go、向后兼容性和 GODEBUG”文档列出了Go 1.23 新增的 GODEBUG 设置
  • Go 1.23 支持在 go.modgo.work 文件中使用新的 godebug 指令,以便独立控制默认 GODEBUG 以及 go.mod 的“go”指令,此外还支持两个版本前(Go 1.21)提供的 //go:debug 指令注释。请参阅更新的默认 GODEBUG 值文档。

更多改进和变更

  • Go 1.23 添加了对 64 位 RISC-V 上的 OpenBSD 的实验性支持 (openbsd/riscv64)。还有一些与 Linux、macOS、ARM64、RISC-V 和 WASI 相关的次要变更。在发布说明中阅读更多关于移植的信息。
  • 使用配置文件引导优化 (PGO) 时,构建时间减少,并且在 386 和 amd64 架构上使用 PGO 的性能得到提升。在发布说明中阅读更多关于运行时、编译器和链接器的信息。

我们鼓励大家阅读Go 1.23 发布说明,以获取有关这些变更以及 Go 1.23 所有新功能的完整详细信息。

在接下来的几周里,请关注后续博客文章,它们将更深入地探讨此处提到的一些主题,包括“range-over-func”、新的 unique 包、Go 1.23 计时器实现变更等。


感谢所有为本次发布做出贡献的人,他们编写了代码和文档、报告了错误、分享了反馈并测试了发布候选版本。大家的努力确保了 Go 1.23 的稳定性尽可能高。一如既往,如果您发现任何问题,请提交问题

尽情享受 Go 1.23 吧!

下一篇文章:对函数类型进行范围遍历
上一篇文章:Go 1.22 中的安全随机性
博客索引