Go - 32 Go 接口(interface)
为什么需要接口?
usb插槽就是现实中的接口,你可以把手机,相机,U盘都插在usb插槽上,而不用担心那个插槽是专门插哪个的,原因是做usb插槽的厂家和做各种设备的厂家都遵守了统一的规定包括尺寸,排线等等(一个接口解决所有的外设)。
在Golang中,多态特性主要是通过接口来实现的。
耦合性降低,通用性增强;
基本介绍
interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型(比如结构体Phone)要使用的时候,在根据具体情况把这些方法写出来(实现)。
基本语法
type 接口名 interface{
method1(参数列表) 返回值列表
method2(参数列表) 返回值列表
.......
}
func (t 自定义类型) method1(参数列表) 返回值列表 {
// 方法实现
}
func (t 自定义类型) method2(参数列表) 返回值列表 {
// 方法实现
}
小结说明:
1.接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法,接口体现了程序设计的多态和高内聚低耦合的思想。
2.Golang中的接口,不需要显式实现,只需要一个变量,含有接口类型中的所有方法。那么这个变量就实现了这个接口。因此,Golang中没有implement这样的关键字。
接口应用场景
项目经理,管理几个程序员,开发一个软件,为了控制和管理软件开发的进度和规范,项目经理可以提前定义一些接口,让程序员去具体实现这些接口;
接口的细节说明:
1.接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例);
2.接口中所有的方法都没有方法体,即都是没有实现的方法;
3.在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了接口;
4.一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型;
5.只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型(可以是任意类型)。
6.一个自定义类型可以实现多个接口(Golang实现接口是基于方法而不是接口,所以很灵活);
7.Golang接口中不能有任何变量;
8.一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现(接口之间可以继承)。
9.interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil
10.空接口interface{} 没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口;
接口的最佳实现
实现对结构体切片的排序:sort.Sort(data interface)
实现接口和继承的比较
接口是对继承的一种补充(猴子还想像小鸟一样飞,像小鱼一样游泳)
// 总结
// 当A结构体继承了B结构体,那么A结构体就自动的继承了B结构体的字段和方法,并且可以直接使用
// 当A结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为,实现接口是对继承机制的补充;
接口和继承解决的问题不同
继承的价值主要在于:解决代码的复用性和可维护性。
接口的价值主要在于:设计,设计好各种规范(方法),让其它自定义类型去实现这些方法;
接口比继承更加灵活
接口比继承更加灵活,继承是满足is -- a 的关系,而接口只需要满足 like -- a 的关系。
接口在一定程度上实现代码解耦