学习golang(8) 初探:接口(1)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第29天,点击查看活动详情

什么是接口

接口在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)去获取类型,只用通过switchinterface.(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) 的内容了,严格意义上来说,他们还不算接口,充其量类似于javaobject,不过我们也看到了interface的特性,还记得之前我们设计go编写一个链式hash么,我们定义的结构体大概是这样的,所以说我们才可以存储任何keyvalue

// 链表Node 实际的hash {key,value}
type Node struct {
	key interface{} // key
	value interface{} // value
	nextNode *Node // 指向下一个节点
}

以上就是接口变量的操作了。

posted @ 2022-04-29 15:33  pdudos  阅读(0)  评论(0编辑  收藏  举报  来源