写点什么

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

评论

发布
暂无评论

程序的机器级表示-数组的分配和访问

引花眠

计算机基础

学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?

沉默王二

Java 学习 程序员 书单

给DevOps加点料——融入安全性的DevSecOps

禅道项目管理

DevOps 运维 测试 开发 安全性

3. 站在使用层面,Bean Validation这些标准接口你需要烂熟于胸

YourBatman

Hibernate-Validator Bean Validation 数据校验

读后感之《任正非:以客户为中心》

王新涵

透彻理解AQS源码分析系列之AQS基础二

InfoQ_d2212957090d

翻转链表,机器学习视觉训练,对数据的人工标注,使信息丢失,John 易筋 ARTS 打卡 Week 16

John(易筋)

大数据 学习 ARTS 打卡计划 翻转链表 Google论文评判人工预处理

你问我答:容器平台改造后的安全是如何解决的?

BoCloud博云

云计算 容器 微服务 PaaS 博云

商业通识 : 商业为什么能进步?

Walker

学习 得到 个人成长 商业

不支持原子性的 Redis 事务也叫事务吗?

大头星

Java redis 事务

Spring 5 中文解析测试篇-Spring测试

青年IT男

Spring5 JUnit

甲方日常 8

句子

工作 随笔杂谈 日常

架构师训练营第十三周总结

张明森

ARTS打卡 第15周

引花眠

微服务 ARTS 打卡计划

握草,你竟然在代码里下毒!

小傅哥

Java 程序员 小傅哥 bug 有毒代码

[翻译] Go Concurrency Patterns: Pipelines and cancellation[Go并发模式]

卓丁

channel pipeline

云原生 go-zero 微服务框架

万俊峰Kevin

微服务 microservice go-zero Go 语言

有奖征文重磅来袭,来!一起玩把大的!

有只小耳朵

2020-09-03-第十三周学习总结

路易斯李李李

深入理解JVM垃圾回收机制 - GC Roots枚举

Skye

GC Roots枚举 安全点 安全区域 OopMap

给大家介绍下,这是我的流程图软件 —— draw.io

程序员小航

工具 流程图 draw.io drawio-desktop 画图软件

LeetCode题解:239. 滑动窗口最大值,单调队列,JavaScript,详细注释

Lee Chen

大前端 LeetCode

oeasy教您玩转linux010206 蒸汽机车 sl

o

Golang Package sync 透析

卓丁

sync Go 语言

拥抱K8S系列-05-基于docker部署面临的问题

张无忌

Docker 运维

用函数式写法精简Java代码的一个例子

Sean

Java 函数式编程

从湖南“软硬兼施”,管窥三湘水畔的智能浪潮

脑极体

ARTS Week15

时之虫

ARTS 打卡计划

阿里巴巴发布国内首个公益区块链标准 用技术让公益公开透明

CECBC

区块链 公益

Go: gops如何与Go运行时交互?

陈思敏捷

gops Go 语言

一点思考|工作十几年了,竟从未用过do-while!

王磊

Java

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