Golang - 如何实现多态

1. 多态
多态是指根据类型的具体实现采取不同行为的能力。如果某个类型实现了某个接口,那么所有使用这个接口的地方,都可以支持这种类型的值。即不同的数据类型的实体实现提供统一的接口。Go中没有类的概念,它的多态是靠接口来实现的。

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

3.实现接口的条件:只要实现了接口中的所有方法,就实现了这个接口。

4.具体代码实现

1)定义一个通知类型:notifier

// 通知者接口
type Notifier interface {
// 通知方法,可以由具体的类进行实现
notify()
}

2)定义微信类型、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)
}
复制代码

3)定义发送通知方法,入参为Notifier;等需要调用的时候,需要传入实现了Notifier中的接口的类型

func sendNotify(notifier Notifier) {
notifier.notify()
}

4)测试一下

复制代码
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)
}
复制代码

测试结果如下:

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

2)空接口的作用

空接口可以存储任意类型值的特点,在接收json字符串不清楚具体类型时,可以通过空接口实现。

posted @   李若盛开  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2022-09-16 Golang - Windows环境下安装make指令
2022-09-16 Golang - type关键字(类型别名)
点击右上角即可分享
微信分享提示