报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

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:494785

评论

发布
暂无评论

央行数研所推出贸易金融区块链平台

CECBC

区块链 金融

不要以为Bug写的好就是好程序员,其实这只占不到15%

小Q

Java 学习 程序员 架构 面试

区块链赋能市场监管 浙江上线“黑科技”清除取证固证难题

CECBC

区块链 市场监管 取证难题

业务架构学习内容有哪些?

周金根

BIZBOK 业务架构

[翻译]Scalable Go Scheduler Design Doc[Go可扩展调度设计文档]

卓丁

golang scheduler Go scheduler Go 语言

记一种spring框架的想当然但错误的用法

小明同学

源码分析 最佳实践 Spring Framework bug

oeasy教您玩转linux 010211 牛说 cowsay

o

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(1),出队 - 摊还复杂度 O(1),JavaScript,详细注释

Lee Chen

大前端 LeetCode

一文解开java中字符串编码的小秘密

程序那些事

java安全编码 java编码指南 UTF编码

架构师课作业 - 第十三周

Tulane

JavaScript引擎的事件循环机制是怎样工作的?

Walker

Java 大前端 运行时栈帧 事件循环

面试必问亿级流量优化策略之JVM调优,文档视频面试,还不收藏

小Q

Java 程序员 架构 JVM jvm调优

TOGAF认证课由2天变化为5天的思考

周金根

企业架构 TOGAF

阿里培训官给新入职程序员的25条建议

Java架构师迁哥

一点 Go Web 编程实践经验

Garfield

Go web Go 语言

宅家三个月玩转算法,再战字节跳动,字节跳动面试官朝我比了个“ok”

编程 字节跳动 面试 算法

朱嘉明:全球科技革命正在逼近“奇点”,区块链影响未来人类社会的走向

CECBC

人工智能 科技 科技革命

.NET委托,事件和Lambda表达式

AI代笔

澳门金沙玩赢了钱提现不了异常注单未更新有什么办法处理?

丛林里的余光

异常检测 澳门金沙 提现不了

【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!

冰河

多线程 高并发 秒杀 电商超卖 签约计划第二季

基于Goc的Golang代码VSCode实时染色方案

大卡尔

测试覆盖率 精准测试 Go 语言

大数据任务调度 - 有向无环图(DAG)之拓扑排序

代立冬

大数据 数据结构 DAG 拓扑排序 Apache DolphinScheduler

LeetCode题解:232. 用栈实现队列,使用两个栈 入队 - O(n), 出队 - O(1),JavaScript,详细注释

Lee Chen

大前端

从新浪数字化转型,窥见互联网的“懂行”新十年

脑极体

从外卖员到拼多多30K+程序员,我付出了三年的青春

小Q

Java 学习 程序员 架构 面试

甲方日常 13

句子

工作 随笔杂谈 日常

架构师训练营第十四周

Melo

Dubbo-go应用维度注册模型

apache/dubbo-go

dubbo dubbo-go dubbogo

藏在Java数组的背后,你可能忽略的知识点

Java架构师迁哥

区块链技术发展的十大趋势

CECBC

区块链 金融 安全问题

这篇文章,把中国科技的真实底子讲透了

CECBC

中国 科技 产业竞争

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