2025 年 2 月 Golang 1.24 正式版发布,主要在运行时性能、工具链增强、提升开发体验等方面做了一些优化。相关内容在官方文档
使用 SwissTable 优化 Map #
旧的 Map 实现使用哈希表的链表法,在 1.24 版本对算法进行了优化,使用了 SwissTable,可以理解为一种新型的开放寻址法的哈希表,最早在 youtube 上被提出并在 cpp 中得到应用。相对于旧版在不同场景都有较大的性能提升。
相关 SwissTable 在 Go 中的提案可以在 这里 找到。
sync.Map 优化 #
优化重构了 sync.Map
,尤其在大规模数据场景下,修改互不重叠的 Key 集合时,发生资源竞争的概率大幅降低。
finalizers 优化 #
增加了新的 runtime.AddCleanup
api,为对象关联清理函数,当对象不可达时自动执行,相较 runtime.SetFinalizer
更为灵活高效且更不易出错。
- 单个对象可附加多个清理函数
- 支持关联内部指针的清理操作,当对象形成循环引用时通常不会引发内存泄漏
- 不会延迟释放对象及其指向资源
Weak 指针 #
提供 weak 指针类型,旨在支持创建内存高效的数据结构。runtime.AddCleanup
被提出就是为了支持其清理逻辑。
os.Root #
提供了新的 os.Root
类型,提供了在指定目录内执行文件系统操作的能力。
使用 OpenRoot
方法可以指定路径为 Root 路径,Open、Create 等操作只能在这个路径以及子路径内执行。
范型扩展 #
引入 slice type alias 特性,可以为泛型定义别名。如:
type MyType[T comparable] = map[T]bool
a := MyType{1, true}
工具链更新 #
引入 tool meta-pattern,工具依赖管理在 go.mod
go get tool github.com/golang/mock/mockgen
go test -json
json 结构化输出测试结果。
CGO #
新增 #cgo noescape cFunctionName
注解,告知编译器传递给 C 函数 cFunctionName 的内存不会逃逸。而在旧版 Go 会确保传递给 C 函数的 Go 指针指向堆上的对象,存在不提要的内存开销。
新增 #cgo nocallback cFunctionName
注解,声明该 C 函数不会回调任何 Go 函数,避免不必要的准备工作,提高性能。
对 C 类型别名进行了限制,新版会拒绝编译存在多个不兼容声明的 C 函数调用。例如若函数 f 同时声明为 void f(int)
和 void f(double)
,cgo 将直接报错而非可能生成错误的 f(0)
调用序列。有助于防止潜在的运行时错误和类型安全问题。
其他 #
其他更新见 官方文档