注意事项:
接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
在golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口
只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
一个自定义类型可以实现多个接口
一个接口(A接口)可以继承多个别的接口(接口B,C),这是如果要实现A接口也必须将B,C接口实现。
interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil
一个接口继承另外两个接口,如果两个接口包含同样的方法时,编译器会报错,程序不会报错
指针实现了空接口时,要使用 var a AInterface = &结构体名称
空接口(interface{})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值
接口和继承:
当A结构体继承了B结构体,那么A结构体就自动的继承了B结构体的字段和方法,并且可以直接使用;
当A结构体需要扩展功能,同时希望不破坏继承关系,则可以实现某个接口即可,实现接口是对继承机制的补充
接口和继承解决 的问题不同:
继承的主要价值在于:解决代码的复用性和可维护性
接口的主要价值在于:设计,设计好各种规范(方法),让其他自定义类型去实现这些方法
接口比继承更加灵活 Person Student
继承是 满足 is - a 的关系,而接口只需满足 like - a 的关系
接口在一定程度上实现代码解耦