11.9 空接口
...大约 1 分钟
11.9 空接口
11.9.1 概念
interface{}
空接口或者最小接口 不包含任何方法,它对实现不做任何要求
可以给一个空接口类型的变量 var val interface {}
赋任何类型的值。
11.9.2 构建通用类型或包含不同类型变量的数组
可以通过空接口作为数组元素类型。
var list []interface{}
list[0] = 1
list[1] = "B"
在使用时需要利用类型断言type-switch
11.9.3 复制数据切片至空接口切片
将切片中的数据复制到一个空接口切片中会出现编译错误
var dataSlice []myType = FuncReturnSlice()
var interfaceSlice []interface{} = dataSlice
cannot use dataSlice (type []myType) as type []interface { } in assignment
原因是它们俩在内存中的布局是不一样的(参考 Go wiki)
11.9.4 通用类型的节点数据结构
在链表中,节点数据可以利用空接口实现通用数据字段
type Node struct {
le *Node
data interface{}
ri *Node
}
11.9.5 接口到接口
一个接口的值可以赋值给另一个接口变量,只要底层类型实现了必要的方法。这个转换是在运行时进行检查的,转换失败会导致一个运行时错误
假定:
var ai AbsInterface // declares method Abs()
type SqrInterface interface {
Sqr() float
}
var si SqrInterface
pp := new(Point) // say *Point implements Abs, Sqr
var empty interface{}
那么下面的语句和类型断言是合法的:
empty = pp // everything satisfies empty
ai = empty.(AbsInterface) // underlying value pp implements Abs()
// (runtime failure otherwise)
si = ai.(SqrInterface) // *Point has Sqr() even though AbsInterface doesn’t
empty = si // *Point implements empty set
// Note: statically checkable so type assertion not necessary.
Powered by Waline v2.15.2