21.Go面向对象-方法值与方法表达式
5 方法值与方法表达式
在上一章节的案例中,我们调用结构体(类)中的方法,一般都是通过如下的方式:
代码语言:javascript复制var dog Dog
dog.Brak()
var cat Cat
cat.Brak()
或者是指针变量,现在,在给大家补充另外一种方式。
方法值
如下所示:
代码语言:javascript复制var dog Dog
dFunc := dog.Brak // 保存方法地址
dFunc()
以上调用的方式称为方法值。
这种方式隐藏了接收者。
方法表达式
还有一种调用的方式是通过 方法表达式,如下所示:
代码语言:javascript复制type Person struct {
name string // 名字
age int // 年龄
sex byte // 性别,字符类型
}
// 定义结构体变量为接收者
func (p Person) SetInfoValue() {
fmt.Printf("SetInfoValue: %p, %vn", &p, p)
}
// 定义结构体指针为接收者
func (p *Person) SetInfoPointer() {
fmt.Printf("SetInfoPointer: %p, %vn", p, p)
}
func main() {
person := Person{"mike", 18, 'm'}
fmt.Printf("main: %p, %vn", &person, person)
// 方法值 f := p.SetInfoPointer // 隐藏了接收者
f1 := (Person).SetInfoValue
f1(person) // 显示把接收者传递过去 ==》 person.SetInfoValue()
f2 := (*Person).SetInfoPointer
f2(&person) // 显示把接收者传递过去 ==》 person.SetInfoPointer()
}
// 执行:
main: 0xc0000a63a0, {mike 18 109}
SetInfoValue: 0xc0000a6400, {mike 18 109}
SetInfoPointer: 0xc0000a63a0, &{mike 18 109}
方法表达式需要显示把接收者传递过去。