关于Golang类型的讲解2——interface接口
接上回,关于Golang类型的讲解1——内置类型和自定义类型 。
前言
上回,我们主要讲了golang中内置类型和自定义类型的定义、区别、以及本质的含义。明白了类型元数据在其中扮演的是一个记录各个类型的底层基础信息的角色,也了解了自定义类型相比内置类型在结构上的差异,也因此知道了为什么自定义类型可以关联function,而内置类型不能。接下来我们继续拓展开来,讲解下interface
一、什么是interface
interface,顾名思义——接口。也即是接口类型。而在我们的接口类型中还分为:空接口类型和非空接口类型。
二、接口类型的组成
1.空接口类型的组成
首先,空接口类型的数据结构组成由两部分组成:
_type *_type (指向接口的动态类型元数据) |
---|
data unsafe.pointer(指向接口的动态值) |
对应结构体代码:
runtine
type eface struct {
_type *_type
data unsafe.Pointer
}
在此,我们举个例子。定义一个空接口类型,注意此时对应的元数据结构eface的成员变量 _type和data都为nil:
var emptyInter interface{
} // eface{_type:nil,data:nil}
如果我们将某个变量a赋值给该空接口变量emptyInter,那么其成员变量:_type即是a的元数据结构信息;data则指向变量a。
举例:
var e interface{
} // 对应的eface结构体: eface{_type: nil, data:nil }
f,_:=os.Open(“eggs