类型系统
这是我参加「第三届青训营 -后端场」笔记创造活动的的第四篇笔记。
在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.
第二种写法是基于已有类型创建自界说类型,即使没有任何的改动,可是对应的类型元数据以及不同了。
如下图: