[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)
}

输出结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值