Golang 类型系统都离不开一个东西,那就是类型元数据。每个类型都有自己对应的类型元数据,正是这些类型元数据构成了 Golang 的类型系统。
内置类型元数据
类型元数据的 header:
1 | type _type struct { |
而除了 header 之外,还需要额外存储一些描述信息,比如 slice 的类型元数据则还有一个类型元数据的指针,指向 slice 中元素类型的类型元数据。
1 | type slicetype struct { |
内置的类型,类型元数据都类似是这样
自定类型元数据
如果是自定类型元数据,则还会有一个 uncommontype 结构体:
1 | type uncommontype struct { |
- pkgpath:用于记录该类型所在的包路径;
- mcount:该类型关联了多少种方法;
- moff:表明从 uncommontype 结构体开始,偏移 moff 就能找到 method 数组,从而调用对应的方法。
别名 alias
我们知道根据现有类型创造新的类型有两种方式:
1 | type MyType1 = int32 |
而第一种方法,就称作起别名,它们会关联到同一个类型元数据,属于同一种类型。而第二种写法则是创建了新的类型,拥有自己的类型元数据。