Go 1.23.0 重磅发布,不少改进

今晨,Go 团队的 Dmitri Shuralyov 代表团队发布了令人期待的 Go 1.23 版本。

Go 1.23 相较于 Go 1.22 有着诸多显著的改进。

完整的发布说明 https://golang.google.cn/doc/go1.23

1. 语言变更:

  • "for-range"循环中的范围表达式现在可以是迭代器函数,例如 func(func(K) bool),这支持了用户对任意序列自定义迭代器。同时,slices 和 maps 包新增了一些与迭代器配合使用的功能,还新增了一个 iter 包。比如可以轻松地将 map 的键收集到切片中并对其值进行排序。
  • 预览支持泛型类型别名,通过设置GOEXPERIMENT=aliastypeparams启用该功能,但跨包边界使用尚不支持。

2. 工具:

  • 介绍了Go工具链的遥测功能,默认情况下收集的统计信息存储在本地计数器文件中,用户可选择上传匿名计数器报告以帮助Go团队了解工具链的使用情况。
  • go命令的一些新标志和功能,如GOROOT_FINAL环境变量不再生效,go env -changed标志只打印与默认值不同的设置,go mod tidy -diff标志以统一差异的形式打印必要的更改而不修改文件,go list -m -json命令新增了一些字段,godebug指令用于声明GODEBUG设置。
  • go vet子命令新增了stdversion分析器,用于标记对当前Go版本中太新的符号的引用。
  • cmd/cgo支持新的-ldflags标志用于向C链接器传递标志。
  • trace工具现在能更好地容忍部分损坏的跟踪,尝试恢复尽可能多的跟踪数据。

3. 运行时:

  • 未处理的恐慌或其他致命错误后,运行时打印的回溯现在会缩进错误消息的第二行及后续行,以便与第一个goroutine的堆栈跟踪明确区分。
  • 编译器使用Profile Guided Optimization的构建时间开销显著降低,并且可以重叠局部变量的堆栈帧槽以减少堆栈使用,对于386和amd64,编译器会使用PGO的信息对齐循环中的某些热块,但此功能可通过设置-gcflags禁用。
  • 链接器现在禁止使用//go:linkname指令引用标准库中未标记的内部符号,同时新增了-bindnow标志用于在构建动态链接的ELF二进制文件时启用即时函数绑定。

4. 标准库:

  • time.Timertime.Ticker的实现有两个重要变化,一是不再被程序引用的TimerTicker立即有资格被垃圾回收,二是与TimerTicker相关的定时器通道现在是无缓冲的,容量为0。这些新行为仅在主Go程序所在的模块使用Go 1.23.0或更高版本时启用,可通过GODEBUG设置还原。
  • 新增unique包用于规范化值,提供了Make[T]函数和Handle[T]类型。
  • 新增iter包用于处理用户定义的迭代器,slicesmaps包新增了一些与迭代器相关的函数。
  • 新增structs包,目前只有HostLayout类型用于指示结构的布局符合主机平台的期望。
  • 其他库的一些小变化,包括archive/tarcrypto/tlscrypto/x509database/sqldebug/elfencoding/binarygo/astgo/typesmath/rand/v2netnet/httpnet/http/httptestnet/netipospath/filepathreflectruntime/debugruntime/pprofruntime/traceslicessyncsync/atomicsyscalltesting/fstesttext/templatetimeunicode/utf16等。
相关推荐
techdashen29 分钟前
Go设计取舍之六: sync.Mutex正常模式与饥饿模式
开发语言·后端·golang
TunerT_TQ41 分钟前
【智能体安全治理|专栏第9期】从“一堆规则”到“数字宪法”:智能体治理的下一个阶段
java·开发语言·安全·开源治理·大模型安全·ai基础设施·智能体安全
Aurorar0rua42 分钟前
CS50 x 2024 Notes Algorithms - 07
c语言·开发语言·学习方法
程序员-Benothing1 小时前
Java ForkJoinPool 详解:从分治思想到高性能并行计算
java·开发语言·后端·面试·职场和发展
脚踏实地皮皮晨1 小时前
003006001_WrapPanel控件
开发语言·c#·.net·wpf·visual studio
上海安当技术2 小时前
单点登录 SSO 怎么选协议?SAML 2.0 / OAuth 2.0 / OIDC / CAS 对比与 ERP、OA、CRM 接入实战
java·开发语言
不才不才不不才2 小时前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
mifengxing2 小时前
计算机组成原理——存储器系统
开发语言·考研·计算机组成原理·复习笔记·计算机408
海清河晏1112 小时前
Qt 实战:信号与槽+事件系统
开发语言·c++·qt
脚踏实地皮皮晨3 小时前
003005002_WPF StackPanel 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio