Goland写结构体方法时,带不带(*)区别和影响

本文探讨了在Golang中定义结构体方法时,使用带(*)和不带(*)的区别。通过示例展示了当结构体包含值类型和引用类型属性时,方法如何影响变量的修改。强调在大多数情况下推荐使用(*)以确保修改的同步,但在引用类型不需要改变其指向时,也可不使用(*)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里我定义一个   定义一个拥有值类型属性的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结构体的切片

总结:以后再写结构体绑定方法时 推荐尽量带上(*),百利无一害,

在对引用类型不需要改变其指向 (地址)时 ,也可以不带上(*).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值