在写go语言的Interface之前我们先要理解go语言“简洁”的特性。相较于其他的编程语言,go语言的语法规则是能省则省,哪怕多省一个字符也行。我们看看go语言的语法做了哪些简化:
1、行代码结束后不需要加”;”。如打印输出:fmt.Printf(“Hello,World”)
2、变量定义和初始化不需要指定类型。如定义并初始化整形变量:num:=100
3、语句不需要添加(),如:for i:=0;i<10;i++{}
除此之外还有很多,举这些例子只是为了下面的讲解做铺垫,不要被go语言的这种语法糖所迷惑。
为了更好的理解go语言的接口和对象,我们不妨和Java语言做对比。
Java是典型的面向对象的编程语言,面向对象的特点是继承、多态和封装。为了实现这些特点,Java设计了接口和类。我们看Java如何实现继承和多态的,代码如下:
//定义Animal类型接口
interface Animal{
void sleep();
void move();
}
//定义实现类Dog
class Dog implements Animal{
String name;
public Dog(String name){
this.name=name;
}
public void sleep(){
System.out.println(name+"爱晚上睡觉");
}
public void move(){
System.out.println(name+"跑的快");
}
}
//定义实现类Cat
class Cat implements Animal{
String name;
public Cat(String name){
this.name=name;
}
public void sleep(){
System.out.println(name+"爱白天睡觉");
}
public void move(){
System.out.println(name+"跳的高");
}
}
public class test {
public static void main(String[] args) {
Animal animal;
//接口执行Dog
animal=new Dog("Dim");
animal.sleep();
animal.move();
//接口执行Cat
animal=new Cat("Tom");
animal.sleep();
animal.move();
}
}
输出结果:
Dim爱晚上睡觉
Dim跑的快
Tom爱白天睡觉
Tom跳的高
Go语言能否实现类似的功能,当然没问题,不过语法方面要做改变。如下:
package main
import (
"fmt"
)
type Animal interface{
sleep();
move();
}
type Dog struct{
name string
}
func (dog Dog) sleep() {
fmt.Println(dog.name+"爱晚上睡觉")
}
func (dog Dog) move() {
fmt.Println(dog.name+"跑的快")
}
type Cat struct{
name string
}
func (cat Cat) sleep() {
fmt.Println(cat.name+"爱白天睡觉")
}
func (cat Cat) move() {
fmt.Println(cat.name+"跳的高")
}
func main(){
var animal Animal
animal=Dog{"Dim"};
animal.sleep();
animal.move();
animal=Cat{"Tom"};
animal.sleep();
animal.move();
}
输出结果:
Dim爱晚上睡觉
Dim跑的快
Tom爱白天睡觉
Tom跳的高
可以看到Go也可以,并且语法上更加的简洁,不需要指明Cat继承的父类,只要你全部实现了接口的函数,就算是完成了继承。这也符合我们现实生活中的规律,只要全部符合某种东西的特征,那肯定就是这种东西啦。
关于子类和父类对象之间的转换,Java、C#语言中通过逆变和协变来实现子类和父类的转换。
Go语言中使用类型断言来判断接口的类型。语法如下:
X.(T)
其中X为interface{}类型 T是要断言的类型。继续刚才的代码:
func sleep(animal Animal){
// if dog,ok:=animal.(Dog);ok{
// dog.sleep()
// }else if cat,ok:=animal.(Cat);ok{
// cat.sleep()
// }
switch a := animal.(type) {
case Dog:
a.sleep()
break
case Cat:
a.sleep()
break
default:
break
}}
sleep(Dog{"Dim"});
sleep(Cat{"Tom"});
输出:
Dim爱晚上睡觉
Tom爱白天睡觉