类型系统

这是我参加「第三届青训营 -后端场」笔记创造活动的的第四篇笔记。

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语言的类型系统。

  • 类型元数据记载的是什么信息呢?

浅析Go的类型系统 | 青训营笔记

上述的 _type只是类型元数据的头,还包括其它信息。

例如像[]string的类型元数据,它的后边还有一个 *_type的指针指向string的类型元数据。

而如果是自界说的类型元数据,那么它的后边还会有一个uncomomontype结构体。

浅析Go的类型系统 | 青训营笔记

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.

第二种写法是基于已有类型创建自界说类型,即使没有任何的改动,可是对应的类型元数据以及不同了。

如下图:

浅析Go的类型系统 | 青训营笔记