Go语言实现多态

简介: Go语言实现多态

多态是什么


相信学过Java这种面向对象语言的同学对于多态来说都不陌生,在代码执行的时候,能够根据子类的类型去执行子类当中的方法。多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。


Go语言多态举例


有这样一个场景,我们在应用开发中涉及到很多通知事件,通知的类型可以是通过微信、QQ、Email等,那么我们可以抽象出一个接口,定义一个通知的接口,然后微信通知类、QQ通知类、Email通知类分别实现对应的通知方法。

  1. 定义一个通知类型:notifier
// 通知者接口
type Notifier interface {
  // 通知方法,可以由具体的类进行实现
  notify()
}

定义微信类型、QQ类型、Email类型,并实现notify方法,以指针类型作为方法的接收者

type WechatNotifier struct {
  Name    string
  Message string
}
func (w *WechatNotifier) notify() {
  fmt.Printf("%v notify %v \n", w.Name, w.Message)
}
type QQNotifier struct {
  Name    string
  Message string
}
func (q *QQNotifier) notify() {
  fmt.Printf("%v notify %v \n", q.Name, q.Message)
}
type EmailNotifier struct {
  Name    string
  Message string
}
func (e *EmailNotifier) notify() {
  fmt.Printf("%v notify %v \n", e.Name, e.Message)
}
  1. 定义发送通知方法,入参为Notifier;等需要调用的时候,需要传入实现了Notifier中的接口的类型
func sendNotify(notifier Notifier) {
  notifier.notify()
}


测试一下

func main() {
  w := &WechatNotifier{
    Name:    "微信",
    Message: "微信消息",
  }
  q := &QQNotifier{
    Name:    "QQ",
    Message: "QQ消息",
  }
  e := &EmailNotifier{
    Name:    "Email",
    Message: "Email消息",
  }
  // 接受微信类型
  sendNotify(w)
  // 接受QQ类型
  sendNotify(q)
  // 接受Email类型
  sendNotify(e)
}

测试结果如下:


c3abac228b6e43e0b815dbfb7bd10d45.png


总结


Golang中主要是采用了接口来实现多态,先定义一个抽象接口,然后再定义具体的实现类并实现接口中的方法,当我们需要定义一个通用的方法时,方法的入参可以接收一个接口类型,这样在程序设计的时候就可以不必多写类似的方法从而接受不同的类了,在程序的运行时,就可以动态地把该接口指向的具体类型,从而执行具体类型的方法!

相关文章
|
17天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
26 7
|
17天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
17天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
16天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
17天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
19天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
29 12
|
18天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
26 9
|
18天前
|
Go 索引
go语言使用range关键字
go语言使用range关键字
24 7
|
18天前
|
Go 索引
go语言修改元素
go语言修改元素
25 6
|
8天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数