会旺旺的就是狗,会喵猫的就是猫

122 阅读2分钟

会旺旺的就是狗,会喵猫的就是猫

Golang 中 Interface 是一种类型,可以理解为Java 中的Object,可以进行传参。

Interface 只定义一种对象的行为规范,不需要实现,由具体的类型来实现规范。

Interface 是一组方法的集合,是duck-type programming的一种体现。

鸭子类型解释是 “如果看起来像鸭子,叫起来像鸭子,那么它一定是鸭子。”

If it looks like a duck and quacks like a duck, it must be a duck.
James Whitcomb Riley

这里重点关注的是你能做什么

假如我们定义,会旺旺叫的就是狗,会喵猫的就是猫。

那么我们可以如下定义,定义两个接口类型Dog ,Cat 分别定义了一个行为

type Dog interface {
    WangWang ()
}
​
type Cat interface {
    MiaoMiao ()
}

定义两个方法,分别接受Dog,Cat两个类型

// 是条狗
func IsDog(d Dog)  {
    fmt.Println("is dog")
    d.WangWang()
}
​
// 是只猫
func IsCat(d Cat)  {
    fmt.Println("is cat")
    d.MiaoMiao()
}

如何实现接口

只要定义的类型实现,了某个接口定义的所有方法,那么就实现了这个接口

定义三种结构体,如下,分别实现了Dog,Cat

Aim3结构体同时实现了Dog,Cat ,所以,一个接口体可以实现多个接口,可以同时具备多个接口的能力。

所以Aim3 是Dog ,也是Cat

// 动物1
type Aim struct {}
// 这里是,值接受者实现接口
func (a Aim)WangWang()  { fmt.Println("wang wang ")}
​
// 动物2
type Aim2 struct {}
// 这里是,指针接受者实现接口
func (a *Aim2)MiaoMiao()  {fmt.Println("miao miao ")}
​
// 动物3
type Aim3 struct {}
func (a Aim3)MiaoMiao()  {fmt.Println("miao miao ")}
func (a Aim3)WangWang()  {fmt.Println("wang wang ")}
​

接下来验证下

 // 动物1
aim:=Aim{}
IsDog(aim)
// IsCat(aim) // 这里会提示,Aim 没有实现 MiaoMiao 方法,不能进行传参
fmt.Println("===========")
// 动物2
aim2:=Aim2{}
IsCat(&aim2)
// 指针类型接收者实现接口,只能通过指针类型传递,
// 值接收者实现的接口,可以传值和指针
fmt.Println("===========")
// 动物3
aim3:=Aim3{}
IsDog(aim3)
IsCat(aim3)
// Aim3 类型分别实现了 WangWang ,MiaoMiao
// 所以,IsDog,IsCat 两个方法都可传进去

输出结果

is dog
wang wang 
===========
is cat
miao miao 
===========
is dog
wang wang 
is cat
miao miao