0
点赞
收藏
分享

微信扫一扫

21.Go面向对象-方法值与方法表达式

21.Go面向对象-方法值与方法表达式

5 方法值与方法表达式

在上一章节的案例中,我们调用结构体(类)中的方法,一般都是通过如下的方式:

var dog Dog
dog.Brak()

var cat Cat
cat.Brak()

或者是指针变量,现在,在给大家补充另外一种方式。

方法值

如下所示:

var dog Dog
dFunc := dog.Brak // 保存方法地址
dFunc()

以上调用的方式称为方法值。

这种方式隐藏了接收者。

方法表达式

还有一种调用的方式是通过 方法表达式,如下所示:

type Person struct {
name string // 名字
age int // 年龄
sex byte // 性别,字符类型
}

// 定义结构体变量为接收者
func (p Person) SetInfoValue() {
fmt.Printf("SetInfoValue: %p, %v\n", &p, p)
}

// 定义结构体指针为接收者
func (p *Person) SetInfoPointer() {
fmt.Printf("SetInfoPointer: %p, %v\n", p, p)
}

func main() {
person := Person{"mike", 18, 'm'}
fmt.Printf("main: %p, %v\n", &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}

方法表达式需要显示把接收者传递过去。



举报

相关推荐

0 条评论