Skip to main content
  1. Docs/

go 1.24 新特性

·2 mins· ·
Owl Dawn
Author
Owl Dawn
Table of Contents

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) 调用序列。有助于防止潜在的运行时错误和类型安全问题。

其他
#

其他更新见 官方文档

参考
#

Related

分布式浅谈
·12 mins
分布式
Go 协程池的一些实现
·2 mins
Golang
Kubenetes 搭建(使用 debian12)
·4 mins
Go Relect 机制
·2 mins
Golang
Kubernetes CSI
·7 mins
Kubernetes Operator
·11 mins