go的方法值和方法表达式

简介: 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)
}

方法值

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

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)调用
}
目录
相关文章
|
4天前
|
存储 Ubuntu Go
在Ubuntu 16.04上安装Go 1.6的方法
在Ubuntu 16.04上安装Go 1.6的方法
10 1
|
4天前
|
存储 Ubuntu Go
在Ubuntu 18.04上安装Go的方法
在Ubuntu 18.04上安装Go的方法
8 1
|
4天前
|
存储 Ubuntu Linux
在Ubuntu 14.04上安装Go 1.6的方法
在Ubuntu 14.04上安装Go 1.6的方法
12 1
|
11天前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
12天前
|
存储 缓存 Java
涨姿势啦!Go语言中正则表达式初始化的最佳实践
在Go语言中,正则表达式是处理字符串的强大工具,但其编译过程可能消耗较多性能。本文探讨了正则表达式编译的性能影响因素,包括解析、状态机构建及优化等步骤,并通过示例展示了编译的时间成本。为了优化性能,推荐使用预编译策略,如在包级别初始化正则表达式对象或通过`init`函数进行错误处理。此外,简化正则表达式和分段处理也是有效手段。根据初始化的复杂程度和错误处理需求,开发者可以选择最适合的方法,以提升程序效率与可维护性。
28 0
涨姿势啦!Go语言中正则表达式初始化的最佳实践
|
11天前
|
运维 监控 算法
[go 面试] 优化线上故障排查与性能问题的方法
[go 面试] 优化线上故障排查与性能问题的方法
|
11天前
|
JSON 测试技术 Go
Go Kit中读取原始HTTP请求体的方法
Go Kit中读取原始HTTP请求体的方法
|
12天前
|
缓存 算法 Go
|
12天前
|
存储 Go 开发者
在Go中对切片/数组求和的多种方法
在Go中对切片/数组求和的多种方法
|
2月前
|
Go
go反射获取变量类型、值、结构体成员、结构体方法
go反射获取变量类型、值、结构体成员、结构体方法
25 0