一.多态
- 多态:同一件事情由于条件不同产生的结果不同
- 由于Go语言中结构体不能相互转换,所以没有结构体(父子结构体)的多态,只有基于接口的多态.这也符合Go语言对面向对象的诠释
-
二.代码示例
结构体实现了接口的全部方法,就认为结构体属于接口类型,这是可以把结构体变量赋值给接口变量
- 重写接口时接收者为
Type
和*Type
的区别*Type
可以调用*Type
和Type
作为接收者的方法.所以只要接口中多个方法中至少出现一个使用*Type
作为接收者进行重写的方法,就必须把结构体指针赋值给接口变量,否则编译报错Type
只能调用Type
作为接收者的方法 ```go type Live interface { run() eat() } type People struct { name string }
func (p *People) run() { fmt.Println(p.name, “正在跑步”) } func (p People) eat() { fmt.Println(p.name, “在吃饭”) }
func main() { //重写接口时 var run Live = &People{“张三”} run.run() run.eat() }
- 既然接口可以接收实现接口所有方法的结构体变量,接口也就可以作为方法(函数)参数
```go
type Live interface {
run()
}
type People struct{}
type Animate struct{}
func (p *People) run() {
fmt.Println("人在跑")
}
func (a *Animate) run() {
fmt.Println("动物在跑")
}
func sport(live Live) {
fmt.Println(live.run)
}
func main() {
peo := &People{}
peo.run() //输出:人在跑
ani := &Animate{}
ani.run() //输出:动物在跑
}