AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

作者:Sergio De Simone

  • 2025-03-12
    北京
  • 本文字数:1127 字

    阅读完需:约 4 分钟

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

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/

2025-03-12 11:495179

评论

发布
暂无评论

架构实战营第四周作业——考试试卷存储

发酵的死神

架构实战营

架构实战营基于redis哨兵模式的考试数据存储设计

慕溶枫

#架构实战营

二叉树遍历和分治

泽睿

算法 遍历 分治

毕业设计:设计电商秒杀系统

Johnny

架构实战营

软件测试基础面试常问问题

程序员阿沐

面试 软件测试 自动化测试 经验分享 测试工程师

从0开始的TypeScriptの一:启航

空城机

typescript 大前端 8月日更

架构实战营-模块4

Cingk

架构实战营-毕业总结

笑春风

网络攻防学习笔记 Day99

穿过生命散发芬芳

态势感知 网络攻防 8月日更

架构实战营 - 模块 4 - 设计千万级学生管理系统的考试试卷存储方案

雪中亮

架构实战营 #架构实战营

初识宽度优先搜索

泽睿

【架构设计模块四】:设计千万级学生管理系统的考试试卷存储方案

Ryoma

iOS官方瘦身方案ODR(二):换肤系统改造|践行 On-Demand Resources

LabLawliet

ios 独立开发者 apple 优化技巧 8月日更

架构实战营模块4作业

子豪sirius

架构实战营

FastApi-08-路径参数校验

Python研究所

FastApi 8月日更

电商秒杀系统设计方案

Lane

prometheus介绍与安装

Rubble

Prometheus 8月日更

模块四

Winston

值值得收藏,揭秘 MySQL 多版本并发控制实现原理

架构精进之路

MySQL MVCC 8月日更

高亮架构训练营毕业设计-设计电商秒杀系统

高亮

架构训练营

商城异地多活架构

arctec

毕业设计

青鸟飞鱼

架构实战营-毕业设计项目

༺NPE༻

架构训练营模块四作业

老实人Honey

架构训练营

业务定制型异地多活架构业务设计

arctec

读尽天下源码,心中自然无码

程序员阿杜

8月日更

架构实战营-毕业设计

笑春风

模块四作业

king

printf函数的常用格式化输出

Changing Lin

8月日更

番外3. Python OpenCV 中如何绘制各种图形?

梦想橡皮擦

8月日更

架构实战营总结

Lane

Go 1.24 带来泛型类型别名、弱指针,并改进了终结器_编程语言_InfoQ精选文章