go的方法值和方法表达式

举报
仙士可 发表于 2023/06/26 17:09:41 2023/06/26
811 0 0
【摘要】 go的方法可分为方法值(method value),和方法表达式(method expression) 2种情况准备工作定义一个结构体,并且声明接收者方法type User struct { id int name string}func (self User) Test() { fmt.Printf("%p,%v\n", self, self)}复制方法值直接将方法声明赋值...

go的方法可分为方法值(method value),和方法表达式(method expression) 2种情况

准备工作

定义一个结构体,并且声明接收者方法

type User struct {
   id   int
   name string
}

func (self User) Test() {
   fmt.Printf("%p,%v\n", self, self)
}
复制

方法值

直接将方法声明赋值给新变量:

func main() {
   u := User{1, "tioncico"}
   u.Test()
   fun1 := u.Test
   u.name="tioncico2"
   fun1()
   u.Test()
}
复制

输出:

GOROOT=/Users/tioncico/sdk/go1.17 #gosetup
GOPATH=/Users/tioncico/go/pkg/mod #gosetup
/Users/tioncico/sdk/go1.17/bin/go build -o /private/var/folders/08/hkdkrdpn4mbb_4l5zbvrq0hh0000gp/T/___go_build_main_go /Users/tioncico/GolandProjects/LearnGoProject/main.go #gosetup
/private/var/folders/08/hkdkrdpn4mbb_4l5zbvrq0hh0000gp/T/___go_build_main_go
%!p(main.User={1 tioncico}),{1 tioncico}
%!p(main.User={1 tioncico}),{1 tioncico}
%!p(main.User={1 tioncico2}),{1 tioncico2}
复制

可看出,方法值为值传递方式,更改name后,fun1的数值并没有更改

方法表达式

func main() {
   u := User{1, "tioncico"}
   u.Test()
   fun1 := (User).Test
   u.name="tioncico2"
   fun1(u)
   u.Test()
}
复制

输出:

GOROOT=/Users/tioncico/sdk/go1.17 #gosetup
GOPATH=/Users/tioncico/go/pkg/mod #gosetup
/Users/tioncico/sdk/go1.17/bin/go build -o /private/var/folders/08/hkdkrdpn4mbb_4l5zbvrq0hh0000gp/T/___go_build_main_go /Users/tioncico/GolandProjects/LearnGoProject/main.go #gosetup
/private/var/folders/08/hkdkrdpn4mbb_4l5zbvrq0hh0000gp/T/___go_build_main_go
%!p(main.User={1 tioncico}),{1 tioncico}
%!p(main.User={1 tioncico2}),{1 tioncico2}
%!p(main.User={1 tioncico2}),{1 tioncico2}
复制

其实可以看出,方法值为 "具体实例的方法",已经存在具体实例,需要通过实例去调用接收者方法,所以不需要额外传入接收者

而方法表达式为:"结构体的方法",需要额外传入结构体进行实际调用

其他

package main

import "fmt"

type User struct {
   id   int
   name string
}

func (self *User) Test() {
   fmt.Printf("%p,%v\n", self, self)
}

func main() {
   var u *User=nil
   u.Test()  //直接实例调用
   (*User)(nil).Test()  //方法值实例(实例值为nil)调用
   (*User).Test(nil)  //方法表达式,传入实例(实例为nil)调用
}
复制
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。