莫方教程网

专业程序员编程教程与实战案例分享

Go 1.24 带来泛型类型别名、弱指针,并改进了终结器

作者 | Sergio De Simone
译者 | 平川
策划 | 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 = 5var weakInt *intweakInt = &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 翻译,未经许可禁止转载。

今日好文推荐
Curl 之父:我是如何枕着18万行C代码还能安稳入睡的
刚刚,DeepSeek 突然公布成本利润率高达545%!做 AI Infra 的该慌了?!
“前端已死”是危言耸听吗?
英伟达“赚钱机器”更强了!盈利创纪录,黄仁勋:DeepSeek 为 GPU 降本,但下一代模型还离不开我
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言

    滇ICP备2024046894号-1