go语言面向对象理解

在写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跑的快

扫描二维码关注公众号,回复: 3158761 查看本文章

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)

其中Xinterface{}类型 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爱白天睡觉

猜你喜欢

转载自blog.csdn.net/luoye4321/article/details/82346149