2025年03月26日 Go生态洞察:Go 1.25 如何移除 core types这一概念 , 回归直观、易学的描述方式
2025年03月26日 Go生态洞察:Goodbye core types - Hello Go as we know and love it! 🐾
摘要 ✨
我是猫头虎,本篇将带你深入剖析 Go 1.25 如何移除 core types这一概念,并探究其对语言规范、编译器实现及未来生态的深远影响。本篇关键词:Go 1.25、core types、type parameters、type constraints、语言规范、泛型。
引言 🐯
在 Go 1.18 中,我们迎来了泛型(generics)、类型参数(type parameters)及类型约束(type constraints),同时引入了一个全新但抽象的概念——core type。虽然 core type 的初衷是简化编译器对泛型操作的处理,但它也带来了额外的复杂度。如今,Go 1.25 决定将“core type”从语言规范中彻底移除,回归直观、易学的描述方式。本篇将全面解读这一变更的来龙去脉,并展望未来可能的优化方向。
猫头虎AI分享:Go生态洞察
- 2025年03月26日 Go生态洞察:Goodbye core types - Hello Go as we know and love it! 🐾
-
- 摘要 ✨
- 引言 🐯
- 作者简介
-
- 猫头虎是谁?
- 作者名片 ✍️
- 加入我们AI编程共创团队 🌐
- 加入猫头虎的AI共创编程圈,一起探索编程世界的无限可能! 🚀
- 正文 🚀
-
- 🐾 类型参数与类型约束
- 🐱👤 示例:索引函数
- 🔍 核心类型详解
- ⚠️ 核心类型的诸多问题
- 🚀 Go 1.25 的规格更新
- 🛠 未来展望
-
- 🗂 知识要点总结
- 🙋 QA 环节
- 总结 🎯
- 参考资料 📚
- 下一篇预告 🔜
- 🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
- 粉丝福利
-
-
- 联系我与版权声明 📩
-
作者简介
猫头虎是谁?
大家好,我是 猫头虎,猫头虎技术团队创始人,也被大家称为猫哥。我目前是COC北京城市开发者社区主理人、COC西安城市开发者社区主理人,以及云原生开发者社区主理人,在多个技术领域如云原生、前端、后端、运维和AI都具备丰富经验。
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用方法、前沿科技资讯、产品评测、产品使用体验,以及产品优缺点分析、横向对比、技术沙龙参会体验等。我的分享聚焦于云服务产品评测、AI产品对比、开发板性能测试和技术报告。
目前,我活跃在CSDN、51CTO、腾讯云、阿里云开发者社区、知乎、微信公众号、视频号、抖音、B站、小红书等平台,全网粉丝已超过30万。我所有平台的IP名称统一为猫头虎或猫头虎技术团队。
我希望通过我的分享,帮助大家更好地掌握和使用各种技术产品,提升开发效率与体验。
作者名片 ✍️
- 博主:猫头虎
- 全网搜索IP关键词:猫头虎
- 作者微信号:Libin9iOak
- 作者公众号:猫头虎技术团队
- 更新日期:2025年07月21日
- 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能!
加入我们AI编程共创团队 🌐
- 猫头虎AI编程共创社群入口:
- 点我进入共创社群矩阵入口
- 点我进入新矩阵备用链接入口
加入猫头虎的AI共创编程圈,一起探索编程世界的无限可能! 🚀
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁
🦄 博客首页——🐅🐾猫头虎的博客🎐
正文 🚀
🐾 类型参数与类型约束
Go 的泛型基于类型参数和类型约束。类型参数就像编译时已知的类型变量,而类型约束描述了这些类型变量允许的操作,通过接口(interface)定义一个类型集(type set)。
例如,下面的接口 Constraint
定义了一个类型集,包含所有底层类型为 []byte
或 string
且实现 Hash() uint64
方法的类型:
type Constraint interface { ~[]byte | ~string Hash() uint64}
任何满足此接口的具体类型,都可用于实例化泛型函数或类型,保证在该类型上执行 .Hash()
操作时总能生效。
🐱👤 示例:索引函数
根据泛型索引表达式的规范,若变量 s
的类型参数 bytestring
满足以下规则:
对类型参数
P
,a[x]
必须对P
类型集中的所有类型均合法,且这些类型的元素类型相同。
则以下函数在 []byte
与 string
类型上均可正确工作:
func at[bytestring Constraint](s bytestring, i int) byte { return s[i]}
🔍 核心类型详解
为简化编译器实现,Go 在泛型上下文中引入了 core type 概念,定义为:
- 非类型参数:其 core type 即为其底层类型(underlying type)。
- 类型参数:若其类型集所有成员具有相同的底层类型,则该底层类型为它的 core type;否则不存在 core type。
例如,interface{ ~[]int }
的 core type 为 []int
,但前文的 Constraint
接口就没有 core type,因为底层既包括 []byte
又包括 string
。
为了支持通道操作和内建函数(如 append
, copy
),core type 的定义还做了额外调整,以兼容不同通道方向及 []byte
/string
的混合类型集。
⚠️ 核心类型的诸多问题
- 过度限制
如 Go 1.24 对切片表达式就依赖 core type,导致对Constraint
类型集的切片操作被禁止,尽管对[]byte
与string
都合法。 - 概念负担
理解通道、切片等特性时,还得掌握 core type,不论是否使用泛型,都需额外学习。 - 异常增多
各种操作(索引、len
/cap
、字段访问等)不统一,core type 反而成为例外源泉,影响规范一致性。
🚀 Go 1.25 的规格更新
Go 1.25(2025 年 8 月发布)完全移除 core type 概念,将所有相关条款还原为说明非泛型情形下的直观描述,并仅在必要处追加针对泛型类型参数的额外段落。行为不变,仅规范更清晰易懂。
Go 1.18 前后
close
函数规范对比旧版(含 core type):
For an argument
ch
with core type that is a channel, the built-in functionclose
records that no more values will be sent on the channel.新版(直观描述):
For a channel
ch
, the built-in functionclose(ch)
records that no more values will be sent on the channel.泛型适配段落:
If the type of the argument to
close
is a type parameter, all types in its type set must be channels with the same element type. It is an error if any of those channels is a receive-only channel.
相似的改动也应用于 append
、copy
、通道发送、切片表达式等多处,彻底剔除 core type 的专有术语。
🛠 未来展望
移除 core type 并非终点,还为更多创新铺平道路:
- 更强切片操作:例如支持对类型集中的共有字段进行切片。
- 改进类型推断:减少显式类型约束,提升 API 易用性(见 issue #69153)。
- 统一规范:原本作为例外的特性将自然归入通用规则(如字段访问、内建函数调用等)。
🗂 知识要点总结
🙋 QA 环节
Q1: 什么是 core type?
core type 是一个泛型类型参数在编译期计算出的底层类型,用于简化编译器对特定操作的处理。
Q2: 为什么要移除 core type?
因为它过于抽象、增加学习成本,又导致规范中出现大量例外,移除后可用更直观的描述替代,同时保持兼容性。
总结 🎯
本文已被猫头虎的「Go生态洞察」专栏收录,带你全面了解 Go 1.25 如何剔除 core types、简化规范、并为未来改进埋下伏笔。详情请点击https://blog.csdn.net/qq_44866828/category_12492877.html
参考资料 📚
- Robert Griesemer. Goodbye core types – Hello Go as we know and love it!, 26 March 2025.
- Go 语言规范(Underlying types, Core types 相关章节).
- Go issue #70128: Proposal to remove core types.
- Go issue #48522, #69153: 未来功能展望。
- Go blog – Core types 介绍: https://go.dev/blog/coretypes
下一篇预告 🔜
在下一篇文章中,我将带来“更可预测的基准测试:使用 testing.B.Loop”,深入剖析 testing.B.Loop
的使用场景与性能优势,敬请期待!
学会Golang语言,畅玩云原生,走遍大小厂~💐
🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
☁️🐳
Go语言开发者必备技术栈☸️
:
🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack |AI
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥
粉丝福利
👉 更多信息:有任何疑问或者需要进一步探讨的内容,欢迎点击文末名片获取更多信息。我是猫头虎,期待与您的交流! 🦉💬
联系我与版权声明 📩
- 联系方式:
- 微信: Libin9iOak
- 公众号: 猫头虎技术团队
- 万粉变现经纪人微信: CSDNWF
- 版权声明:
本文为原创文章,版权归作者所有。未经许可,禁止转载。更多内容请访问猫头虎的博客首页。
点击✨⬇️下方名片
⬇️✨,加入猫头虎AI编程共创社群。一起探索科技的未来,共同成长。🚀
🔗 猫头虎AI编程共创500人社群 | 🔗 GitHub 代码仓库 | 🔗 Go生态洞察专栏 ✨ 猫头虎精品博文专栏🔗