-
-
由于Go语言中结构体不能相互转换,所以没有结构体(父子结构体)的多态,只有基于接口的多态.这也符合Go语言对面向对象的诠释
-
-
-
重写接口时接收者为
Type
和*Type
的区别-
*Type
可以调用*Type
和Type
作为接收者的方法.所以只要接口中多个方法中至少出现一个使用*Type
作为接收者进行重写的方法,就必须把结构体指针赋值给接口变量,否则编译报错 -
Type
只能调用Type
-
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() }
- 既然接口可以接收实现接口所有方法的结构体变量,接口也就可以作为方法(函数)参数
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() //输出:动物在跑 }