Go方法值与方法表达式详解

104 阅读2分钟

Go方法值与方法表达式

自己看Go语言圣经的时候,对这块理解有点蒙,于是写一篇文章来记录一下,希望能给大家带来帮助

方法值与方法表达式

通常情况下,我们选择一个方法,在同一个表达式里执行,但实际上也可以分为两步来执行,只需要把一个方法传给一个变量。 这里可以有两种执行方式:

  1. 方法值:所谓的隐式调用,需要将一个实例化的方法对象传给变量
  2. 方法表达式:显式调用,需要传递一个实例化的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 小明}

以上就是方法表达式和方法值的用法。