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

2022-01-17 10:31:44 浏览数 (1)

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} 

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

0 人点赞