这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
类型系统:
类型系统是高级语言的核心,它存在于语言规范中,向开发者明确了类型的能力、使用规则与约束;它存在于编译器中,保证开发者对类型的正确合规使用;它也存在于语言运行时里,为类型提供如多态这样的动态能力。
可以说,高级编程语言用类型系统赋能类型并管理类型。不过,不同语言的类型系统的设计与实现是有较大差别的,那么Go语言的类型系统又有哪些与众不同之处呢?我们接下来就来重点看看Go的类型系统。
Go语言类型系统:
命名类型:
具有名称的类型:例如:int, int64, float32, string, bool等。这些已经是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相关标识符等类型描述信息。