GoSuda

Go 1.24 发布概述:Swiss Table 映射、ML-KEM、os.Root 与 testing/synctest

By Lemon Mint views ...

Go 1.24 正在成为一个意义重大的版本,引入了一系列围绕性能、安全性和开发者体验的增强功能。这些变更旨在使 Go 在构建现代应用程序时更加强大和高效。

性能提升

通过一组具有代表性的基准测试,整体性能得到改进,CPU 开销降低了 2% 至 3%。这些改进包括全新的内置 map 实现、小对象更高效的内存分配,以及全新的运行时内部互斥锁实现。实际结果可能因应用程序而异。

后量子密码学

引入 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 函数在隔离的“bubble”中启动一组 goroutine,synctest.Wait 函数则等待当前 bubble 中的所有 goroutine 阻塞。该包处于实验阶段,必须在构建时设置 GOEXPERIMENT=synctest 才能启用。

构建缓存

go run 可执行文件现在会被缓存,以加快执行速度。重复执行时速度更快,但代价是缓存体积会变大。

Cgo 性能

新增 #cgo noescape 和 #cgo nocallback 注解,以提升 Cgo 性能。#cgo noescape cFunctionName 告知编译器传递给该 C 函数的内存不会逃逸。#cgo nocallback cFunctionName 告知编译器该 C 函数不会回调任何 Go 函数。

弱指针

支持弱指针,可在不阻止内存回收的情况下安全地引用内存。弱指针是一种底层原语,用于创建内存高效的数据结构,例如用于关联值的弱 map、规范化 map 以及各类缓存。

基准测试改进

新增 testing.B.Loop 方法,使基准测试更加快速且不易出错。对于每个 -count,基准函数将恰好执行一次,因此昂贵的设置和清理步骤只会执行一次。函数调用的参数和结果会被保持存活,从而防止编译器完全优化掉循环体。

Go 1.24 正在成为一个在语言及其生态系统的各个方面都有显著改进的重要版本。

Go 1.24 概览