> 技术文档 > 2025年03月26日 Go生态洞察:Go 1.25 如何移除 core types这一概念 , 回归直观、易学的描述方式

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”从语言规范中彻底移除,回归直观、易学的描述方式。本篇将全面解读这一变更的来龙去脉,并展望未来可能的优化方向。

2025年03月26日 Go生态洞察:Go 1.25 如何移除 core types这一概念 , 回归直观、易学的描述方式

猫头虎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 定义了一个类型集,包含所有底层类型为 []bytestring 且实现 Hash() uint64 方法的类型:

type Constraint interface { ~[]byte | ~string Hash() uint64}

任何满足此接口的具体类型,都可用于实例化泛型函数或类型,保证在该类型上执行 .Hash() 操作时总能生效。


🐱‍👤 示例:索引函数

根据泛型索引表达式的规范,若变量 s 的类型参数 bytestring 满足以下规则:

对类型参数 Pa[x] 必须对 P 类型集中的所有类型均合法,且这些类型的元素类型相同。

则以下函数在 []bytestring 类型上均可正确工作:

func at[bytestring Constraint](s bytestring, i int) byte { return s[i]}

🔍 核心类型详解

为简化编译器实现,Go 在泛型上下文中引入了 core type 概念,定义为:

  1. 非类型参数:其 core type 即为其底层类型(underlying type)。
  2. 类型参数:若其类型集所有成员具有相同的底层类型,则该底层类型为它的 core type;否则不存在 core type。

例如,interface{ ~[]int } 的 core type 为 []int,但前文的 Constraint 接口就没有 core type,因为底层既包括 []byte 又包括 string

为了支持通道操作和内建函数(如 append, copy),core type 的定义还做了额外调整,以兼容不同通道方向及 []byte/string 的混合类型集。


⚠️ 核心类型的诸多问题

  1. 过度限制
    如 Go 1.24 对切片表达式就依赖 core type,导致对 Constraint 类型集的切片操作被禁止,尽管对 []bytestring 都合法。
  2. 概念负担
    理解通道、切片等特性时,还得掌握 core type,不论是否使用泛型,都需额外学习。
  3. 异常增多
    各种操作(索引、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 function close records that no more values will be sent on the channel.

新版(直观描述)

For a channel ch, the built-in function close(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.

相似的改动也应用于 appendcopy、通道发送、切片表达式等多处,彻底剔除 core type 的专有术语。


🛠 未来展望

移除 core type 并非终点,还为更多创新铺平道路:

  • 更强切片操作:例如支持对类型集中的共有字段进行切片。
  • 改进类型推断:减少显式类型约束,提升 API 易用性(见 issue #69153)。
  • 统一规范:原本作为例外的特性将自然归入通用规则(如字段访问、内建函数调用等)。

🗂 知识要点总结
要点 说明 类型参数 & 约束 泛型占位符及其接口定义的类型集 core type 概念 泛型操作中用于编译器简化的抽象底层类型 限制与混淆 对切片、通道等操作过度依赖,增加学习和理解成本 Go 1.25 规范更新 移除 core type,恢复直观描述,仅在泛型情形下补充特定段落 未来可能改进 更灵活切片操作、类型推断、规范统一

🙋‍ QA 环节

Q1: 什么是 core type?

core type 是一个泛型类型参数在编译期计算出的底层类型,用于简化编译器对特定操作的处理。

Q2: 为什么要移除 core type?

因为它过于抽象、增加学习成本,又导致规范中出现大量例外,移除后可用更直观的描述替代,同时保持兼容性。


总结 🎯

本文已被猫头虎的「Go生态洞察」专栏收录,带你全面了解 Go 1.25 如何剔除 core types、简化规范、并为未来改进埋下伏笔。详情请点击https://blog.csdn.net/qq_44866828/category_12492877.html

参考资料 📚

  1. Robert Griesemer. Goodbye core types – Hello Go as we know and love it!, 26 March 2025.
  2. Go 语言规范(Underlying types, Core types 相关章节).
  3. Go issue #70128: Proposal to remove core types.
  4. Go issue #48522, #69153: 未来功能展望。
  5. 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


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥

学习 复习 Go生态 ✔ ✔ ✔

粉丝福利


👉 更多信息:有任何疑问或者需要进一步探讨的内容,欢迎点击文末名片获取更多信息。我是猫头虎,期待与您的交流! 🦉💬


联系我与版权声明 📩

  • 联系方式
    • 微信: Libin9iOak
    • 公众号: 猫头虎技术团队
    • 万粉变现经纪人微信: CSDNWF
  • 版权声明
    本文为原创文章,版权归作者所有。未经许可,禁止转载。更多内容请访问猫头虎的博客首页。

点击✨⬇️下方名片⬇️✨,加入猫头虎AI编程共创社群。一起探索科技的未来,共同成长。🚀

🔗 猫头虎AI编程共创500人社群 | 🔗 GitHub 代码仓库 | 🔗 Go生态洞察专栏 ✨ 猫头虎精品博文专栏🔗

在这里插入图片描述

在这里插入图片描述