Duck Typing

golang的接口很有意思,与java的思路不一样,java中是申明是的,必须使用关键字implements。而golang中则用的是Duck-Like的模式,如果子类的行为与接口一致,则这个子类就实现了该接口。如果某个东西的行为和鸭子一样,那么我们就说这个是一个只鸭子。

Java接口

interface AInterface{
     void behavior();
}
class ConcreteClass implements AInterface {
     void behavior();
}

上面的例子就是Java的中实现接口, 必须使用implements 关键字。

Golang 接口

type Car interface {
    Drive()
}

type EVCard struct {
    color string
}
func (c *EVCard) Drive() {
    fmt.Println("EVCar Drive");
}

上面的代码是实现了接口, 可以看到EvCard 这个struct没有使用任何的关键字,只不过接口上有一个Driver()方法,结构体上也有这个Driver()名字一样的方法而已。

实际举例

package main

import "fmt"

type Car interface {
    Drive()
    Wash()
    GetColor()
}

type EVCard struct {
    color string
}
func (c *EVCard) Drive() {
    fmt.Println("EVCar Drive");
}

func (c *EVCard) Wash() {
    fmt.Println("Wash EvCar");
}
func (c *EVCard) GetColor() {
    fmt.Println(c.color);
}

type Person struct {
    car Car
}

func main()  {
    person := &Person{
        car:&EVCard{
            color:"White",
        },
    }

    person.car.Drive()
    person.car.Wash()
    person.car.GetColor()
}

上面的这个例子很好的演示了golang中的多态。

欢迎大家一起交流。