Golang 类型系统实现

Golang 类型系统都离不开一个东西,那就是类型元数据。每个类型都有自己对应的类型元数据,正是这些类型元数据构成了 Golang 的类型系统。

内置类型元数据

类型元数据的 header:

1
2
3
4
5
6
7
8
9
10
11
12
13
type _type struct {
size uintptr
ptrdata uintptr
hash uint32
tflag tflag
align uint8
fieldalign uint8
kind uint8
alg *typeAlg
gcdata *byte
str nameOff
ptrToThis typeOff
}

而除了 header 之外,还需要额外存储一些描述信息,比如 slice 的类型元数据则还有一个类型元数据的指针,指向 slice 中元素类型的类型元数据。

1
2
3
4
type slicetype struct {
typ _type
elem *_type
}

内置的类型,类型元数据都类似是这样

自定类型元数据

如果是自定类型元数据,则还会有一个 uncommontype 结构体:

1
2
3
4
5
6
type uncommontype struct {
pkgpath nameOff
mcount uint16
_ uint16 // unused
moff uint32
}
  • pkgpath:用于记录该类型所在的包路径;
  • mcount:该类型关联了多少种方法;
  • moff:表明从 uncommontype 结构体开始,偏移 moff 就能找到 method 数组,从而调用对应的方法。

别名 alias

我们知道根据现有类型创造新的类型有两种方式:

1
2
type MyType1 = int32
type MyType2 int32

而第一种方法,就称作起别名,它们会关联到同一个类型元数据,属于同一种类型。而第二种写法则是创建了新的类型,拥有自己的类型元数据。