Go语言实现多态

多态是什么

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

Go语言多态举例

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

  1. 定义一个通知类型:notifier
// 通知者接口
type Notifier interface {
	// 通知方法,可以由具体的类进行实现
	notify()
}
  1. 定义微信类型、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()
}
  1. 测试一下
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)
}

测试结果如下:
在这里插入图片描述

总结

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