在编程语言和类型论中,多态指为不同数据类型的实体提供统一的接口。 -wiki

package main

import "fmt"

type notifier interface{
    notify()
}

type user struct{
    name string
    email string
}

func (u *user) notify() {
    fmt.Printf("Sending user email to %s<%s>\n", u.name, u.email)
}

type admin struct{
    name string
    email string
}

func (a * admin) notify(){
    fmt.Printf("Sending admin email to %s<%s>\n", a.name, a.email)
}

func main(){
    bill := user{"Bill", "[email protected]"}
    sendNotification(&bill)
     lisa:= admin{"Lisa", "[email protected]"}
    sendNotification(&lisa)
}

func sendNotification(n notifier){
    n.notify()
}

在代码5-7行,我们创建了一个notifier接口,并且在该接口中声明了一个notify方法。

在9-12行,我们声明了一个结构体user。user具有两个字段,一个是string类型的name,另外一个是email。18-21行我们声明了另外一个结构体admin。

14-16行,我们声明了接收者为user的notify方法,因为notifier接口只有norify方法,所以user结构体即实现了notifier接口。23-25行admin结构体同样也声明了notify方法,实现了notifier接口。

在35-37行,我们声明了sendNotification方法,该方法接收一个notifier类型的值,并且在方法体内部调用了notify方法。

28-33行声明的main函数是程序的入口,首先我们初始化了一个user用户,然后我们接着声明了一个admin用户。在29行我们调用了sendNotification方法,传入了bill,此时调用了user结构体声明的notify方法,输出Sending user email to Bill。32行我们以同样的方式调用了sendNotification方法,但是传入lisa,此时则调用的是admin结构体声明的notify方法,输出Sending admin email to Lisa