1、接口是用来定义行为的类型
对接口值方法的调用会执行接口值里存储的用户定义的类型的值对应的方法
eg:
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)
}
func main() {
u := user{"miller", "1089795101@qq.com"}
sendNotification(&u)
}
func sendNotification(n notifier) {
n.notify()
}
2、方法集定义了接口的接受规则
因为不是总能获取一个值的地址,所以值的方法集只包括了使用值接收者实现的方法。
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)
}
func main() {
u := user{"miller", "1089795101@qq.com"}
//传值会报错
sendNotification(u)
}
func sendNotification(n notifier) {
n.notify()
}
报错:\TestInterface.go:23:18: cannot use u (type user) as type notifier in argument to sendNotification:
user does not implement notifier (notify method has pointer receiver)
改:
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)
}
func main() {
u := user{"miller", "1089795101@qq.com"}
//传值会报错
sendNotification(u)
}
func sendNotification(n notifier) {
n.notify()
}
3、多态
package main
import "fmt"
//定义了通知类行为的接口
type notifier interface {
notify()
}
//user在程序里定义了一个用户类型
type user struct {
name string
email string
}
// notify 使用指针接收者实现了notifier接口
func (u *user) notify() {
fmt.Printf("Sending user email to %s<%s>\n",
u.name,
u.email)
}
//定义了程序里的管理员
type admin struct {
name string
email string
}
//使用指针接收者实现notifier接口
func (a *admin) notify() {
fmt.Printf("Sending admin email to %s<%s>\n",
a.name,
a.email)
}
func main() {
u := user{"miller", "1089795101@qq.com"}
a := admin{"bob","american.cn"}
//传值会报错
sendNotification(&u)
sendNotification(&a)
}
func sendNotification(n notifier) {
n.notify()
}
函数
sendNotification接收一个实现了notifier接口的值作为参数,这个函数能够实现多态的行为。