#1099 Golang 类型系统
Golang 2026-03-25看了这篇博客 Go 语言之父亲自下场道歉:藏在 Spec 里的十年“笔误”,终于要修正了!,讲的是 Go 语言规范中对 bool 类型定义的长期笔误被修正,其本质是内建类型(predeclared type)而非自定义类型(defined type)。
重新梳理一下我对 Golang 类型系统的一点认知。
-
从实现角度看,Go 类型系统可以抽象为三个核心维度:
- Type Identity(类型同一性):决定类型是否相等
- Underlying Type(底层类型):决定类型转换规则
- Assignability(可赋值性):决定类型之间是否可以直接使用
大多数类型问题,本质都是这三者的组合。
-
类型系统
Type ├── Named Type(命名类型) │ ├── Predeclared Type(内建类型) │ ├── Defined Type(通过 type 定义的新类型) │ └── Type Parameter(泛型参数) ├── Unnamed Type(Type Literal) └── Alias(类型别名,声明机制,不是类型分类)-
Named Type(命名类型)
- 具有类型标识(Type Identity)
- 类型相等 => 是否为同一 Type Identity(即同一声明)
- Defined Type 支持方法绑定(行为扩展)
- 用于语义建模
- 每个类型都有 underlying type,用于决定类型转换和兼容性
-
Unnamed Type(未命名类型,或者叫类型字面量 Type Lit),即 TypeLit,比如:
struct{}、[]T、map[K]V、func(int) string- 无类型名,仅结构定义
- 类型相等 => 结构一致(Structural Identity:字段、顺序、tag 等完全一致)
- 不支持方法绑定
- 用于数据组合
-
Alias
- 复用原类型的 Type Identify
- 不创建新类型,和原类型完全等价
- 不能绑定新的方法(Alias 不能作为 receiver,方法由原类型决定)
- 应用场景
- 包结构重构:旧包中给新包类型定义别名,可以不影响旧代码,也可以保障 API 兼容。
- 在对外暴露的包中定义别名,减少调用方包导入
-