11.9 空接口

Kesa...大约 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 wikiopen in new window

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