GoSuda

Go 1.24 有哪些新特性?

By Lemon Mint
views ...

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 正在成为一个重要的版本,在语言及其生态系统的各个方面提供了实质性的改进。

Overview of Go 1.24