前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >21.Go面向对象-方法值与方法表达式

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

作者头像
Devops海洋的渔夫
发布2022-01-17 10:31:44
1000
发布2022-01-17 10:31:44
举报
文章被收录于专栏:Devops专栏Devops专栏

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, %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} 

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 21.Go面向对象-方法值与方法表达式
    • 5 方法值与方法表达式
      • 方法值
      • 方法表达式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档