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

92 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

类型系统:

类型系统是高级语言的核心,它存在于语言规范中,向开发者明确了类型的能力、使用规则与约束;它存在于编译器中,保证开发者对类型的正确合规使用;它也存在于语言运行时里,为类型提供如多态这样的动态能力。

可以说,高级编程语言用类型系统赋能类型并管理类型。不过,不同语言的类型系统的设计与实现是有较大差别的,那么Go语言的类型系统又有哪些与众不同之处呢?我们接下来就来重点看看Go的类型系统。

Go语言类型系统:

命名类型:

具有名称的类型:例如:intint64float32stringbool等。这些已经是GO中预先声明好的类型。

基础类型:

如果T 是预先声明类型:boolean, numeric, or string(布尔,数值,字符串)中的一个,或者是一个类型字面量(type literal),他们对应的基础类型就是T自身。

否则,T的基础类型就是 T所引用的那个类型的类型声明(type declaration)。

类型转换:

package main

type Meter int64

type Centimeter int32

func main() {
    var cm Centimeter = 1000
    var m Meter
    m = Meter(cm)
    print(m)
    cm = Centimeter(m)
    print(cm)
}

类型一致性:

两种类型要么相同,要么不相同。

  • 一个命名类型一定和其它类型都不同。
  • 如果他们基础类型的字面量在结构上是等价的,他们就是相同的类型。

因此,预先声明的命名类型 int, int64, 等都是不一致的。

自定义类型表达式:

  // 自定义结构体类型 cType 即为类型名
  // cType类型
  type cType struct {
  A int
  }
   
  // 依据已有自定义类型自定义一个新类型
  // 类型cType1
  // 特别注意的是cType类型如果定义有方法,那么cType1上是不会带过来的
  type cType1 cType
   
  // 依据已有内置类型自定义一个新类型
  // 类型cInt
  type cInt int
   
  // go语言中func也是一种类型
  // 因为func也可以作为值传递
  type handler func(err error) error
   
  // 自定义接口类型 iFace 即为类型名
  type iFace interface {
  DoSomething() bool // 接口是一组方法定义的集合,接口的方法定义不需要func关键词只需要方法签名
  }

类型元数据-MetaData:

go运行时(runtime)为每种类型定义了底层的类型描述信息数据,这些描述信息共同构成了类型元数据。runtime._type这个结构体就是类型元数据的基石,记录了类型名称、大小、内存对齐边界、gc相关标识符等类型描述信息。