go-实现多态

229 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路# 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()
 }
 
 输出结果:
 写字 圆珠笔
做笔记 记事本
写字 圆珠笔