golang的多态

多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都支持这种类型的值。

如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋给这个接口类型的值。

go语言的接口采用鸭子类型的思想(如果走起路来像鸭子,那么它就是鸭子),实现时不需要显式的声明实现了什么接口。下面的Cat和Dog的实现是一个例子:

package main

import (
	"fmt"
)

type Animal interface {
	Eat()
	Sleep()
}

type Cat struct {
	name string
	food string
}

func (c *Cat) Eat() {
	fmt.Printf("%s eats %s.\n", c.name, c.food)
}

func (c *Cat) Sleep() {
	fmt.Printf("%s sleep.\n", c.name)
}

type Dog struct {
	name string
	food string
}

func (d *Dog) Eat() {
	fmt.Printf("%s eats %s.\n", d.name, d.food)
}

func (d *Dog) Sleep() {
	fmt.Printf("%s sleep.\n", d.name)
}

func main() {
	animal1 := &Cat{"cat", "fish"}
	Eat(animal1)
	Sleep(animal1)
	animal2 := Dog{"dog", "pork"}
	Eat(&animal2)
	Sleep(&animal2)
}
cat eats fish.
cat sleep.
dog eats pork.
dog sleep.

main函数创建一个Animal类型的值, 并将animal1和animal2的地址传给了Eat和Sleep, 这会导致最终具体类型Cat和Dog的对应方法的执行, 因此这个Eat和Sleep函数可以同时执行Cat和Dog的行为


wechat
微信扫一扫,订阅我的博客动态^_^