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)
}
输出结果: