请点击上方蓝字TonyBai订阅公众号!

Go 1.18引入泛型[1]无疑是Go语言发展史上的一个里程碑,它带来了类型参数、类型约束等强大的新特性。伴随这些特性,一个名为“核心类型”(Core Type)的抽象概念也被引入,旨在简化泛型初期的规范定义和编译器实现。
然而,随着社区对泛型理解的深入和实践的积累,“核心类型”带来的复杂性和局限性也逐渐显现。近日,Go团队在提案#70128[2]中正式决定,并已在开发分支中实施:将在即将到来的Go 1.25版本[3](预计2025年8月发布)中,从Go语言规范[4]中移除“核心类型”这一概念。这项看似底层的改动,实则对Go语言的简洁性、易学性以及未来发展具有深远意义。
关于Go 1.18泛型语法概念以及实现的详细说明,可以阅读我的《Go语言第一课》[5]专栏中的“泛型篇[6]”。
“核心类型”:泛型时代的权宜之计
在Go 1.18设计泛型时,为了快速有效地更新语言规范以适应类型参数,Go团队引入了“核心类型”。这里对当前版本Go规范中对Core Types的说明进行了截图如下:

Core Types概念的理解还是有门槛的,但结合泛型类型参数一起,简单来说就是:
对于非类型参数的类型,其核心类型就是其底层类型[7]。
对于类型参数,其核心类型是其类型集(Type Set)中所有类型共同拥有的**唯一*底层类型。如果类型集中类型的底层类型不唯一,则该类型参数没有核心类型。
例如,下面约束类型的核心类型是[]int:
interface{ ~[]int }
但对于下面约束类型Constraint:
type Constraint interface {
~[]byte | ~string
Hash() uint64
}
由于其包含[]byte和string两种不同的底层类型,它便没有核心类型。
这种设计在当时起到了

最低0.47元/天 解锁文章
467

被折叠的 条评论
为什么被折叠?



