接口
多态是指代码可以根据类型的具体的实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,,都可以支持这种类型的值。标准库里面有很好的例子
如io包里实现的流式处理接口。
在程序的声明和实现接口是会涉及很多细节。即便实现的是已有接口,也需要了解这些接口是如何工作的。
实现
接口是用来定义行为类型的,这些被定义的行为不由接口直接实现,而是通过方法由用户定义的类型实现。如果用户定义的某个接口类型声明一组方法,
那么这个用户定义的类型值就可以赋值给这个接口的类型值,。这个赋值会把用户定义的类型值存入接口类型的值。
对接口值方法的调用会执行接口值里面存储的用户定义的类型值对应的方法。因为任何用户定了的类型都可以实现接口,所以对接口值方法调用是一种自然的多态
。在这个关系里面,用户定于的类型通常叫做实体类型,原因是如果离开内部存储的用户定义的类型的值得实现,接口值没有具体的行为。
方法集
package main
import "fmt"
type notifier interface {
notify()
}
type user struct {
name string
email string
}
func (u *user) notify() {
fmt.Printf("Sending Email to %s<%s>\n", u.name, u.email)
}
func sendNotification(n notifier) {
n.notify()
}
func main() {
u := user{"peter", "peter@qq.com"}
sendNotification(&u)
}