Golang Interface空接口类型转换

最近工作中写Golang的代码比较多,之前对Golang不太了解,现在也是一边写一边学,慢慢的涉猎一些Golang方面的内容。今天来看看Golang中的Interface, 也就是接口

01

interface简单介绍

1、什么是接口?

interface在Golang中,是接口的意思。

接口,其实是一组方法的集合。它是一个抽象的概念,用例子来理解,就比较容易。

如下面的代码,inter,就是一个接口,并且包含2个方法,func1和func2:

2、接口的特点

a、接口里面的方法都没有方法体,接口定义里面没有变量;

b、接口不需要显式的实现(也就是没有implement关键字),只要某个类型,实现了接口的方法,我们就说这个类型实现了接口。

如下代码,impl类型,实现了inter接口:

输出结果如下:

c、接口本身不能实例化。

d、接口可以指向一个实现了该接口的自定义变量,这个变量可以是结构体,也可以是一个常见的类型,例如int,但是必须是自定义的

如下:

输出结果如下:

上述代码中,变量b的类型是myint,它本质上是int类型的,myint实现了接口inter,所以变量b可以直接赋值给inter类型的变量d

e、一个自定义类型,可以实现多个接口。

f、接口之间可以继承,某个类型如果要实现子接口,需要将父接口的方法也全部实现。

g、包含0个方法的接口,称之为空接口,所有的类型,都实现了空接口。

最经典的空接口的例子,可能就是fmt.Println这个打印函数了,它的代码如下:

上述例子中,Println函数,传入any类型的参数,都可以打印。其实就是因为所有类型都实现了interface{}这个空接口,所以所有类型都可以通过fmt.Println来进行打印。

02

空接口类型转换方法

有了上面的基础,可以开始今天的主题了,如果某个函数的参数是一个空接口类型,那么这个函数可以接受任意类型的参数。

但是需要明确的一点是,空接口类型的参数可以传入任意类型,但是空接口 不等于 其他类型。

如果某个函数,使用了空接口作为参数,而我们想获取参数并执行相关操作(例如字符串截取,数字自增等)的话,就需要知道参数的真实类型, 然后才能做具体的操作,否则代码有可能直接panic。

先来看一段有问题的代码:

我们在main函数中调用inter2Type函数,参数传入数字1,然后这个函数是对数字1进行加1操作。可以发现,语法提示interface{}类型不能直接进行自增操作,因为它不是int类型。

正确的写法是下面这样:

先判断下interface{}参数的真实类型,然后再进行对应的操作。

如果是string,则拼接;如果是int或者float64,则加1 。

这里,我们的函数只兼容string,int,float64这3种类型,其实数据类型远不止这么多,如果还有其他类型的函数,我们可以在switch case语句中,设置default函数来过滤其他类型。例如上述例子中,最后我们传入的float32类型,输出结果:

Golang接口相关的案例,其实还有很多,大家可以去官网查看。

开发做的多了,总结了一个学习方法,就是学这种开发语言和学习MySQL一样,官方文档,永远是第一手资料,指的反复咀嚼。

今天就这样吧。