Go 1.24 有哪些新特性?
Go 1.24 正在成为一个重要的版本,引入了一系列侧重于性能、安全性和开发者体验的增强功能。这些改变旨在使 Go 在构建现代应用程序方面变得更加强大和高效。
性能提升
通过一系列具有代表性的基准测试,CPU 开销普遍降低 2-3%,从而实现了整体性能提升。这些改进包括新的内置 map 实现、更高效的小对象内存分配以及新的运行时内部 mutex 实现。结果可能因应用程序而异。
后量子密码学
引入 crypto/mlkem
包,实现了 ML-KEM-768 和 ML-KEM-1024。
ML-KEM 是一种后量子密钥交换机制,以前称为 Kyber,并在 FIPS 203 中指定。这一新增功能为 Go 未来的加密安全性做好了准备。
TLS 增强
在 TLS 中支持 Encrypted Client Hello (ECH)。此功能可通过填充 Config.EncryptedClientHelloKeys
字段启用,从而增强 TLS 连接的隐私性和安全性。
新的 Swiss Table Map
一种增强的 map 实现,以获得更好的性能。此新实现基于 Swiss Tables,并且可以使用 GOEXPERIMENT=noswissmap
构建标志禁用。
Sync Map 更新
改进了 sync.Map
中 map 修改的性能。不相交的键集的修改在更大的 map 上发生竞争的可能性大大降低,并且不再需要任何预热时间即可实现 map 的低竞争负载。如果您遇到问题,可以使用 GOEXPERIMENT=nosynchashtriemap
恢复到旧实现。
增强的 JSON 编组
一个新的 omitempty
标签选项,用于在 JSON 编组期间更智能地省略结构体字段。当进行编组时,如果结构体字段的值为零,则带有 omitempty
选项的该字段将被省略。如果字段类型具有 IsZero() bool
方法,则该方法将用于确定值是否为零。
运行时清理
引入 AddCleanup
函数以替代 SetFinalizer
,以实现更好的资源管理。与 SetFinalizer
不同,它不会复活其所附加的对象以进行终结,并且可以向单个对象附加多个清理操作。新代码应优先使用 AddCleanup
而非 SetFinalizer
。
go.mod 中的工具指令
通过 go.mod
中的工具指令改进了可执行文件依赖项跟踪。这消除了以前将工具作为空白导入添加到通常命名为“tools.go”的文件中的变通方法的需求。
目录限制访问
新的 os.Root
类型用于受控的文件系统操作。os.Root
类型提供了在特定目录内执行文件系统操作的能力,从而防止访问指定路径之外的区域。
测试改进
新的 testing/synctest
包用于测试并发代码。synctest.Run
函数在隔离的“气泡”中启动一组 goroutine,而 synctest.Wait
函数等待当前气泡中的所有 goroutine 阻塞。此包是实验性的,必须通过在构建时设置 GOEXPERIMENT=synctest
来启用。
构建缓存
go run
可执行文件现在被缓存以加快执行速度。这使得重复执行更快,但代价是缓存更大。
Cgo 性能
新的 #cgo noescape
和 #cgo nocallback
注解用于提高 Cgo 性能。#cgo noescape cFunctionName
告诉编译器传递给 C 函数的内存不会逃逸。#cgo nocallback cFunctionName
告诉编译器 C 函数不会回调任何 Go 函数。
弱指针
支持弱指针,以安全地引用内存而不会阻止回收。弱指针是提供的一种低级原语,旨在创建内存高效的结构,例如用于关联值的弱映射、规范化映射和各种缓存。
基准测试改进
新的 testing.B.Loop
方法,用于更快、更不易出错的基准测试。基准测试函数将精确地每次 -count
执行一次,因此昂贵的设置和清理步骤只执行一次。函数调用参数和结果保持活跃,防止编译器完全优化掉循环体。
Go 1.24 正在成为一个重要的版本,在语言及其生态系统的各个方面提供了实质性的改进。