Go方法值与方法表达式
自己看Go语言圣经的时候,对这块理解有点蒙,于是写一篇文章来记录一下,希望能给大家带来帮助
方法值与方法表达式
通常情况下,我们选择一个方法,在同一个表达式里执行,但实际上也可以分为两步来执行,只需要把一个方法传给一个变量。 这里可以有两种执行方式:
- 方法值:所谓的隐式调用,需要将一个实例化的方法对象传给变量
- 方法表达式:显式调用,需要传递一个实例化的struct对象作为参数
方法值
// 方法值调用
package main
import "fmt"
type Student struct{
id int
name string
}
// 指针方法
func (s* Student) PointerMethod(){
fmt.Printf("我是指针方法:%p,%v",s,s)
}
// 值方法
func (s Student)ValueMethod(){
fmt.Printf("我是值方法:%p,%v",&s,s)
}
func main(){
// 方法值
stu:=Student{1,"小明"}
pointerMethod:=stu.PointerMethod
valueMethod:=stu.ValueMethod
//1
valueMethod()
//2
pointerMethod()
stu.id=2
stu.name="小红"
//3
valueMethod()
//4
pointerMethod()
}
这里可以猜一下得出的值,可以猜到1和3的地址是不同的,2和4由于指针相同,所以地址相同。2和4中的值是不同的,因为传入的对象是指针对象,所以原对象的改变会影响方法的调用,结果如下:
我是值方法:0x1400011a030,{1 小明}
我是指针方法:0x1400011a018,&{1 小明}
我是值方法:0x1400011a078,{1 小明}
我是指针方法:0x1400011a018,&{2 小红}·
方法表达式
func main(){
// 方法表达式
// 这里编译器不会帮你转化,所以方法的调用者必须正确,否则会报错
pointerMethod:=(*Student).PointerMethod
//不能写成Student.PointerMethod
pointerMethod(&stu)
valueMethod:=(Student).ValueMethod
valueMethod(stu)
}
查看结果为:
我是指针方法:0x1400011a018,&{1 小明}
我是值方法:0x1400011a048,{1 小明}
以上就是方法表达式和方法值的用法。