译者 | 平川
策划 | Tina
Go 语言在最新版本 1.24 中引入了几个重要的特性,包括泛型类型别名、弱指针,并改进了终结器等。它还增强了 map
默认实现、小对象分配以及互斥锁处理的运行时性能。
Go 语言的类型别名为现有类型提供了一个同义词,这非常有助于提高可读性和简洁性。现在,Go 1.24 允许为泛型类型创建类型别名。也就是说,类型别名可以指定一个类型参数。
type ComparableVector[T comparable] = Vector[T]
type ComparableVectorOfInts = ComparableVector[int]
type ThisWouldBeAnError = ComparableVector[[]int]
这里有必要回顾一下,Go 提供了一种类似的语法,用于在现有类型的基础上定义新类型,例如 type NewInt int
。尽管语法的差别只是少了=
,但由于 NewInt
不能代替 int
,所以影响还是很大的。
有趣的是,对于是否引入泛型类型别名及其对语言的影响,有关讨论已经持续了三年多。
弱指针不会增加对象的引用计数。当一个对象只被弱指针引用时,垃圾回收器就可以释放它。因此,在尝试使用弱指针的值之前,应检查它是否为 nil
:
var strongInt int = 5
var weakInt *int
weakInt = &strongInt
...
weakInt.Value()
在实现对象缓存等功能时,弱指针可能很有用,因为它可以避免对象仅仅因为包含在缓存中而被保留下来。
Go 终结器的作用是在对象被垃圾回收时进行清理。在 Go 1.24 之前,这项工作可以使用 [runtime.SetFinalizer](https://tip.golang.org/pkg/runtime#SetFinalizer)
来完成,但有几个需要注意的事项,包括:无法在同一个对象上定义多个终结器;终结器对涉及引用循环的对象不起作用,等等。为了克服这些限制,Go 1.24 提供了一个新的运行时函数 AddCleanup
,用于为对象注册清理函数:
runtime.AddCleanup(objPointer, cleanupFunc, resourceToCleanUp)
...
func cleanupFunc(resourceToCleanUp CleanUpArgType) {
...
}
该清理机制解决了上述终结器问题。此外,它还能确保所有的清理函数都在单独的 goroutine 中顺序调用。
如前所述,Go 1.24 改进了 map
的运行时性能。特别是,它采用 SwissTable 作为实现 map
的基础,并使用并发 hash-trie 来实现 sync.Map
。
使用 SwissTable,大型 map 的访问和分配速度提高了 30%,预设大小 map 的分配速度提高了 35%,迭代速度提高了 10% 到 60%,具体取决于 map 中数据项的多少和大小。
同样,采用并发 hash-trie 后,在几乎所有基准测试中,新的 sync.Map
实现都击败了旧实现。
Go 1.24 包含的改进和更改远不止这些,其中还包括:字节包和字符串包中新增的函数、ommitzero json 标签、目录受限的文件系统访问等。虽然发布说明一如既往地简洁,但你可以观看 Reddit 用户 GreenTowel3732 发布在 YouTube 上的精彩视频概述。
原文链接:
https://www.infoq.com/news/2025/02/go-1-24-generic-aliases/
声明:本文为 InfoQ 翻译,未经许可禁止转载。