什么是接口
接口在go
中的关键字是interface
,是一种抽象类型,(其他类型我们称之为显示类型/基础类型),你可以将它想象为一个盒子,可以装任何东西,如果你之前没有接触过其他语言类似于虚函数/多态,那么理解interface
较为困难。
声明一个接口类型变量
如我们前面所述,interface
也是我们的一个类型,只不过这个类型是一个抽象类型,没有关于它的基本操作,但是我们可以使用它来存放任何数据,我们来看下
声明一个interface
var data interface{}
该interface
可以存放任何数据,例如
data = 1 data = "pdudo juejin" data = errors.New("dasdadsada")
类型转换
假设我们声明了且使用interface
来存放数据,由于它只是一个抽象的类型,没有相关类型的基本操作,所以我们需要将其转换为它相应的类型,从而进行操作。
类型断言
想要进行类型转换,不管是隐式的还是显式的,我们都需要来确定该接口应该是哪种类型才行,不过在此之前,我们可以使用反射(reflect.TypeOf
)来查看一下接口的类型。
例如:
我们有如下代码,我们可以来打印一下它的类型
我们执行下
可以看到,我们顺利拿到了类型,其第一次为int
, 第二次为string
除此之外,我们还可以使用interface.(type)
来进行类型断言,例如:
我们可以使用 _, ok := data.(int)
来进行变量转换,若判断成功,ok
则为true
,否则为false
我们运行下
除此之外,我们使用switch
配合interface.(type)
来判断类型,其实是用的最多的
例如
我们执行下
我们可以看到,相关类型都已经被打印出来了,请注意,我们不能直接使用interface.(type)
去获取类型,只用通过switch
和interface.(type)
才能获取数据类型,进行case
判断。
类型转换
我们上述已经看了如何去进行类型断言,判断interface
是属于那种类型了,我们再来看下如何进行类型转换呢,类型转换和断言类型,我们只需要x = interface.(类型)
就可以拿到相应的值了,例如:
前提是我们需要得到接口数据的类型才行
我们执行下,我们可以得到结果
接口的组成
接口组成,我们可以分为2部分: 动态类型 和 动态值,他们大概像这样的
空接口
当我们声明了一个接口,什么也不做的时候,抽象出来大概是这样的
var data interface{}
因为为nil
, 所以,我们可以用data == nil
来判断是否为空接口,例如
我们执行下程序
可以看到,输出正如我们所预料的,是一个空接口
传入一个值
若我们这样来编写程序
var data interface{} var ss int = 99 data = ss
此时interface
抽象出来大概是这样的
请注意,go
中永远是指传递,所以即使,我们修改了ss
变量的值,也不会影响data
,我们来看下
我们执行下
总结
以上内容便是接口(1) 的内容了,严格意义上来说,他们还不算接口,充其量类似于java
的object
,不过我们也看到了interface
的特性,还记得之前我们设计go
编写一个链式hash
么,我们定义的结构体大概是这样的,所以说我们才可以存储任何key
和 value
呢
// 链表Node 实际的hash {key,value} type Node struct { key interface{} // key value interface{} // value nextNode *Node // 指向下一个节点 }
以上就是接口变量的操作了。