这里我定义一个 定义一个拥有值类型属性的A结构体
并给与相应的方法f1
在主函数中 初始化A, n=0 ,并调用f1
想通过 绑定方法f1修改 主函数 A的n值,
而结果是
这是因为A结构体是值类型,而且A的属性也是值类型,所以上述f1方法等价与下面f2函数,本质是通过值拷贝
而结果可想而知
这时就可以通过指针引用解决问题
在func (a A)中的A前加* -->func (a *A)
同理此方法等价于
传入是A结构体的引用,即是地址,这样的话通过地址修改数值,就可确保修改统一
若是结构体内的属性是引用类型
这里我 定义一个拥有引用类型属性的B结构体,并且有可以修改
这时无论绑定方法带不带(*)都可以通过方法修改切片里的值
因为切片本身时引用类型,调用方法,通过拷贝,拷贝的是切片arr的地址,所以方法和main修改的是同一对象。
但这不代表结构体属性都是引用类型时,带(*)和不带(*)是一样的,如下:
还是这个方法,但是这次时 将切片赋予[]int{1,1,1},即B.arr=[]int{1,1,1}
分别执行m1和m11
m11 带(*)
m1不带(*)
结果发现两者结果不一致,带(*)的完成同步,而不带(*)就没实现同步
其原因是 带(*)是把B结构体的地址传入方法,拷贝的是地址,方法是对B结构体的地址所指属性操作
而不带(*)是把B的结构体进行值拷贝,
原本的内存状况
在执行b.arr=[]int{1,1,1}后 状况
m1中 切片地址发生改变 ,不会影响main中的 B结构体的切片
总结:以后再写结构体绑定方法时 推荐尽量带上(*),百利无一害,
在对引用类型不需要改变其指向 (地址)时 ,也可以不带上(*).