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() }