类型系统
这是我参与「第三届青训营 -后端场」笔记创作活动的的第四篇笔记。
在Go中分类内置类型和自定义类型
常见的内置类型:
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
自定义类型:
type T int
type T struct{
name string
}
type T interface {
Name() string
}
我们无法给内置类型定义方法,同时接口类型是无效的方法接受者,因此也无法给接口自定义方法。
类型元数据
无论是内置类型还是自定义类型都有对应的类型描述信息,称为类型元数据,每一种类型元数据都是全局唯一的,共同构成了Go语言的类型系统。
- 类型元数据记录的是什么信息呢?
上述的 _type只是类型元数据的头,还包含其它信息。
例如像[]string的类型元数据,它的后面还有一个 *_type的指针指向string的类型元数据。
而如果是自定义的类型元数据,那么它的后面还会有一个uncomomontype结构体。
uncommontype结构体记录着自定义类型的各种信息,例如我们自定义一个这样的类型:
type myslice []string
func (ms myslice) Len(){
}
func (ms myslice) Cap(){
}
通过uncommontype的地址加上moff字节的偏移那么久可以找到myslice关联的元数据数组了。
接下来我们借助类型元数据看一下取别名和自定义类型的区别:
type MyType1 = int32
type MyType2 int32
第一种写法是取别名,它会和int32共享同一个类型元数据,例如Go语言中的rune和int32.
第二种写法是基于已有类型创建自定义类型,即使没有任何的改变,但是对应的类型元数据以及不同了。
如下图: