接口
接口类型是对其他类型行为的概括与抽象。
接口即约定
接口是一种抽象类型,它并没有暴露所含数据布局或者内部结构,当然也没有那些数据的基本操作,它所提供的仅仅提供一些方法而已。
接口类型
一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义中的所有方法
接口的实现
如果一个类型实现了一个接口要求的所有方法,那么这个类型实现了这个接口。换一种说法就是说,一个具体类型”是一个“特定的接口类型,者其实就代表着该具体类型实现了该接口。
接口的值
一个接口类型的值,分为两个部分:一个具体类型和该类型的一个值。二者为接口的动态类型和动态值。
接口特点:
- 接口的零值就是把它的动态类型和动态值都设置为nil
- 一个接口值是否是nil取决于它的动态类型,可以使用value == nil或value != nil来检测一个接口值是否是nil
- 调用一个nil接口的任何方法都会导致奔溃
- 接口值可以使用==和!=操作符来做比较。如果两个接口值都是nil或者二者的动态类型完全一致且二者动态值相等,那么两个接口值相等。
类型断言
类型断言是一个作用在接口值上的操作,写出来类似与x.(T)
,其中x是一个接口类型的表达式,而T是一个类型(称为断言类型)。类型断言会检查作为操作数的动态类型是否满足指定的断言类型。
- 如果断言类型T是一个具体类型,那么类型断言会检查x的动态类型是否就是T。如果检测成功,类型断言的结果就是x的动态值,类型当然就是T。换句话说,类型断言就是用来从它的操作数中把具体类型的值提取出来的操作。
- 如果断言的类型T是一个接口类型,那么类型断言检查x的动态类型是否满足T。如果检测成功,动态值并没有提取出来,结果仍是一个接口值,接口值的类型和值部分也没有变更,只是结果的类型为接口类型T
类型分支
switch x.(type) {
case nil:
//
case int, uint:
//
case bool:
//
case string:
//
default:
///
}
that‘s all