一、前言
Go虽然不算是面向对象语言,但它支持面向对象一些特性,面向接口编程是Go一个很重要的特性,而Go的接口与Java的接口区别很大,Go的接口比较复杂,这里仅用一个最简单例子做介绍,复杂的我也还没学。
二、接口定义与实现简单例子
与定义结构体(struct)类似,上面代码我们定义了Shaper接口,它有一个方法Area,任何实现了这个函数(或方法)的类型我们都认为它实现了Shaper接口。
说明
1、实现接口并不需要显式声明,不用像Java那样用implements实现接口,只需要实现接口中所有方法(函数)就表示实现了该接口。
2、接口可以被结构体(可以理解为长残了的类)实现,也可以被函数类型实现。
3、接口被实现条件
-
接口的方法与实现接口类型方法格式要完全一致,包括方法名、参数类型、返回值都需要完全一样。
-
接口所有方法都被实现。
这点和Java没有什么区别。
4、area := Shaper(rect) 这条语句绑定了接口和结构体,然后就可以调用接口的方法了。
三、多态
面向对象三大特性,封装、继承及多态,Go既然支持了OOP,那多态的特性它肯定也要能支持的,多态简单理解就是在运行时决定使用哪个实现类,我们来看一个简单例子理解一下。
结构体1定义及对接口的实现
结构体2定义及对接口的实现
调用接口的函数会执行对应结构体函数的实现
根据运行时传入的是矩形还是三角形结构体调用对应的实现函数。
注:其实和Java中接口的概念还是比较类似的,Go相对更灵活吧(是指在调用时再去绑定接口和实现?偶还没领悟到灵活在哪?)