[Go语言学习记录]func(x *XX)funcName() 与 func(x XX)funcName()的区别

func(x *XX)funcName() 与 func(x XX)funcName()的区别

最早接触go的时候就很不理解,为某种类型定义结构体方法为什么有func(x *XX)的情况与func(x XX)的情况。
最早也是凭借以往学习C++的经验先入为主的把func(x XX)理解成了C++中的 :: (作用域符号)

// 类似于
void XX::funcName() 
{
	// PASS
}

这就导致我更不能理解有了func(x *XX)与func(x XX)了
后来细读了go语言圣经的《方法》才理解(x *XX)和(x XX)在这里表示的是“接收器(receiver)”

我们在其他语言中,调用结构体内声明/实现的方法,操作自己本身的变量都需要调用this,self等关键字,而go语言这里是要用户自己定义一个接收器的名字,而(x *XX)和(x XX)区别便是接收器的类型!

x *XX 表示接收器本身是指针类型,可以再方法内修改接收器的数据,而非指针类型的func(x XX)却不行

// 实例代码
type xx struct {
	val int
}

func (x *xx) pp1() {
	x.val = 10
	println(x.val)
}

func (x xx) pp2() {
	x.val = 20
	println(x.val)
}

func TestTtpe(t *testing.T) {
	var x xx
	x.val = 0
	x.pp1()
	println(x.val)
	x.pp2()
	println(x.val)
}

输出结果:
[Go语言学习记录]func(x *XX)funcName() 与 func(x XX)funcName()的区别_第1张图片

你可能感兴趣的:(Go,golang,学习,c++)