package main
//当用接收者的类型是值类型的时候,只能调用或者传参为值类型,且只能在调用的时候实现值类型的方法
//当接收者是指针的接收者的时候,可以调用所有的接口的方法集。
//且 指针接受者的方法优先级最高,即使指针接收者可以调用值类型的方法,但是对于修改地址变量不生效。
//外部类型的结构体会拥有嵌入的结构体的方法,并且方法可以在外部类型结构体中重写。
//关于引入公开包中的是否公开属性,
//1.大写开头的方法或者属性为外部可访问的属性和方法 小写则是私有
//第一: 标识符才有公开或者未公开属性值没有。
//第二 短变量操作符有能力捕获引用的类型,并创建一个为公开的类型的变量。
//永远不能显示创建一个公开的变量,不过短变量声明操作符可以这么做
import "fmt"
//notifier 定义了一个通知类行为的接口
type notifier interface {
notify()
}
//user定义了一个用户类型
type user struct {
name string
email string
}
func (u *user) notify () {
fmt.Printf("Sending user email %s,%s\n",u.name,u.email)
}
type admin struct {
user //嵌入类型
level string
}
func (a *admin) notify() {
fmt.Printf("Sending admin email %s,%s \n",a.name,a.email)
}
func main() {
ad:= admin{
user: user{
name: "John",
email: "John@yahoo.com",
},
level: "super",
}
sendNotification(&ad) //这里会程序会自己去找方法,如本身存在则直接执行,否则会去找父级的方法 否则报错!
ad.user.notify() //调用父级类型的方法
ad.notify() //调用自己的方法
}
func sendNotification(n notifier) {
n.notify()
}