go的方法值和方法表达式
【摘要】 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)