写点什么

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

评论

发布
暂无评论

PlayStation@4功能介绍及测试应用

行者AI

测试

资深首席架构师预测:2021年云计算的8个首要趋势

Rancher

容器 rancher

Rancher年终盘点丨历尽千帆,岁月可期

Rancher

rancher

区块链数据存储与IPFS技术的融合应用

CECBC

区块链 数据存储

架构师训练营11W作业

Geek_f06ede

华为交换机恢复出厂设置的三种方法

腾讯云大数据发布数据生态战略,构建开源开放数仓生态

腾讯云大数据

大数据 数据仓库

Java达到什么样的水平才能通过阿里社招?

Java架构师迁哥

请用思维导图画出架构师训练营所有技术知识点

Jacky.Chen

2020年度国产数据库:openGauss

墨天轮

数据库

APICloud AVM 多端开发 | 外卖app开发案例教程(下)

YonBuilder低代码开发平台

大前端 Web Worker APICloud

LeetCode题解:347. 前 K 个高频元素,快速排序,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

从技术视角看考拉海购的云原生之路

阿里巴巴中间件

云计算 云原生

功能测试用例设计方法分享

行者AI

测试

在onelogin中使用OpenId Connect Authentication Flow

程序那些事

权限系统 OAuth 2.0 程序那些事 权限架构 OpenConnect

Angel图神经网络算法在推荐场景下的实践

DataFunTalk

大数据

元旦在家撸了两天Seata源码,你们是咋度过的呢?

冰河

分布式事务 分布式数据库 分布式存储 数据一致性 seata

看云上 ClickHouse 如何做计算存储分离

腾讯云大数据

大数据 Clickhouse

2021年区块链十大发展趋势:那些偶然中的必然

CECBC

货币

腾讯云加速构建云原生数据仓库,助力企业数字化转型

腾讯云大数据

大数据 数据仓库

音视频技术入门基础

赖猫

c++ 音视频 ffmpeg

ClickHouse的实践之路

DataFunTalk

数据库

AI面临产业大考:落地虽难,但产业化路径已日渐清晰

脑极体

区块链脱虚向实 市场教育基本完成

CECBC

区块链

Windows Server 做网络转发

wong

Windows Server netsh

Apache Pulsar 12月月报:Pulsar 2.7.0 发布!

Apache Pulsar

大数据 开源 pulsar Apache Pulsar 消息系统

一文彻底吃透MyBatis源码!!

冰河

架构 mybatis 架构设计 框架 源码解析

谷歌被反垄断诉讼后,美国互联网会再度繁荣吗?

脑极体

架构师训练营技术知识点

业哥

SRE灵魂之SLI和SLO

勇往直前的胖子

SRE SLO

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