1. 什么是多态
多态是指根据类型的具体实现采取不同行为的能力。如果某个类型实现了某个接口,那么所有使用这个接口的地方,都可以支持这种类型的值。即不同的数据类型的实体实现提供统一的接口。Go中没有类的概念,它的多态是靠接口来实现的。
2. 在Go中的实现
先定义一个抽象的接口,这个接口规定了结构体应当实现什么方法,比如:
//定义一个eater接口,只要某个结构体实现了这个接口的全部方法,即实现了这个接口
type eater interface {
eat()
}
定义一个通用的函数,这个函数的传入参数接收一个接口类型:
//eating函数接收一个eater接口
func eating(e eater) {
e.eat()
}
对上述的接口做两个实现
type people struct {
name string
age int
}
//people 结构体实现了eat方法,即实现了eater接口的所有方法,因此people实现了eater接口
func (p *people) eat() {
fmt.Printf("%v is eating\n",p.name)
}
type dog struct {
name string
hoster string
age int
}
//dog 结构体也实现了eater接口
func (d *dog) eat() {
fmt.Printf("%v is eating, its hoster is %v\n", d.name,d.hoster)
}
在调用时即可直接调用eating函数,在程序运行时,就可以动态地将接口指向具体的类型,如下:
func main() {
x := &dog{
name : "xiaobai",
age : 3,
hoster : "dahei",
}
d := &people{
name: "dahei",
age : 16,
}
eating(x) //调用eating函数,将x传入,程序可以在运行时动态地把eater接口指向dog类型,从而调用dog的方法。
eating(d)
}