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)调用
}
目录
相关文章
|
21天前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
30 11
|
2月前
|
大数据 Shell Go
GO方法与自定义类型
本文详细介绍了 Go 语言中的自定义数据类型与方法。不同于传统的面向对象编程语言,Go 通过结构体 (`struct`) 和方法 (`method`) 来扩展自定义类型的功能。文章解释了如何定义结构体、创建方法,并探讨了值接收器与指针接收器的区别及应用场景。此外,还介绍了方法的可见性以及接收器的命名惯例。通过具体示例,帮助读者更好地理解和应用这些概念。
|
2月前
|
安全 Go C语言
Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用
这篇文章介绍了Go语言中使用`const`定义常量的方法,包括常量的特性“隐式重复前一个表达式”,以及如何使用`iota`实现枚举常量的功能。
|
3月前
|
存储 Ubuntu Go
在Ubuntu 16.04上安装Go 1.6的方法
在Ubuntu 16.04上安装Go 1.6的方法
40 1
|
3月前
|
存储 Ubuntu Go
在Ubuntu 18.04上安装Go的方法
在Ubuntu 18.04上安装Go的方法
38 1
|
3月前
|
存储 Ubuntu Linux
在Ubuntu 14.04上安装Go 1.6的方法
在Ubuntu 14.04上安装Go 1.6的方法
49 1
|
3月前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
3月前
|
存储 缓存 Java
涨姿势啦!Go语言中正则表达式初始化的最佳实践
在Go语言中,正则表达式是处理字符串的强大工具,但其编译过程可能消耗较多性能。本文探讨了正则表达式编译的性能影响因素,包括解析、状态机构建及优化等步骤,并通过示例展示了编译的时间成本。为了优化性能,推荐使用预编译策略,如在包级别初始化正则表达式对象或通过`init`函数进行错误处理。此外,简化正则表达式和分段处理也是有效手段。根据初始化的复杂程度和错误处理需求,开发者可以选择最适合的方法,以提升程序效率与可维护性。
48 0
涨姿势啦!Go语言中正则表达式初始化的最佳实践
|
3月前
|
运维 监控 算法
[go 面试] 优化线上故障排查与性能问题的方法
[go 面试] 优化线上故障排查与性能问题的方法
|
3月前
|
JSON 测试技术 Go
Go Kit中读取原始HTTP请求体的方法
Go Kit中读取原始HTTP请求体的方法