go面向对象方法的调用
在面向对象三大特征(封装、继承和多态)里面,go语言只有封装这个功能。但可以使用匿名字段包含,间接实现继承。
type Resouce struct {
_ uint8
id int
}
type User struct {
Resouce //匿名字段,User间接继承自Resource
name string
}
// 接收者类型为 User 时,可访问方法集全部为 User 的方法,简称 T 方法
// 接收者类型类型 *User 时,可访问方法集为 User 和 *User 的方法,简称 T + *T 方法。
// 接收者类型类型 Manager 包含匿名字段 User,则 Manager 方法集包含 User 方法。
// 接收者类型类型 Manager 包含匿名字段 *User,则 Manager 方法集包含 T + *T 方法。
// 不管嵌入 User 或 *User,*Manager 方法集总是包含 T + *T 方法。
func (self *User) ToString() string {
return fmt.Sprintf("User = %p, %v", self, self)
}
func (self User) TestValue() {//User拷贝
fmt.Printf("TestValue: %p, %v\n", &self, self)
}
type Manager struct {
User//匿名字段
title string
}
func (self *Manager) ToString() string {
return fmt.Sprintf("Manager = %p, %v", self, self)
}
func main() {
m := Manager{User{Resouce{id:1}, "jorn"}, "zhang"}
fmt.Println(m.ToString())
fmt.Println(m.User.ToString()) //通过匿名字段,获得和继承类似的利用能力
//调用方法一:instance.method(args...)
mInstance := m.ToString()
m.name = "huangbin"
fmt.Println(mInstance)
fmt.Println(m.ToString())
//调用方法二:<type>.func(instance, args...)
mFunc := (*User).ToString
fmt.Println(mFunc(&m.User))
mFunc2 := (User).TestValue
mFunc2(m.User)
}