本文已参与「新人创作礼」活动,一起开启掘金创作之路# 1、go实现多态 Go中没有implements关键字,也没有extends,但并不意味着go不能实现多态和继承。 为了降低代码的耦合度,我们可以使用接口的方式来实现多态。
1、概述
相同的一类东西,因为有同样的行为,相同的行为我们可以写成接口,当同类去调用这个接口的时候会产生不一样的行为。任何用户定义的类型都可以实现任何接口,所以通过不同实体类型对接口值方法的调用就是**多态 **
2、简单解释
比如:我定义了一个文具的接口,我有笔和本子两个不同的实体,他们都有用来学习的属性,但用来学习的行为不同,一个是写字,另一个是记录。有这两种形态,我们可以调用文具的学习接口,实现两个不同的行为。
3、代码实现
//定义一个文具的接口
type stationery interface{
study() //可以用来学习
}
//定义一个pen的struct
type pen struct{
name string
}
//定义一个book的struct
type book struct{
name string
}
//学习行为,使用指针接收者实现了study接口,方法会共享接收者所指向的值pen
func(p *pen)study(){
fmt.Println("写字",p.name)
}
//学习行为,使用值接收者实现了study接口,方法使用b值的副本,对b的修改不会影响原值
func (b book)study(){
fmt.Println("做笔记",b.name)
}
/接收一个stationery接口类型的值,如果一个实体类型实现了该接口,
//sendNotify函数会根据实体类型的值类执行stationery接口的study行为,这个函数具有多态的能力。
func sendStationery(s stationery){
s.study()
}
func main(){
//实例化结构体并赋值为圆珠笔
pen1 :=pen{"圆珠笔"}
sendStationery(&pen1)
//实例化结构体并赋值
book1:=book{"记事本"}
sendStationery(&book1)
//声明一个staionery接口
var s stationery
//将实体类型赋值
s =&pen1
s.study()
}
输出结果:
写字 圆珠笔
做笔记 记事本
写字 圆珠笔