golang中方法接收者,使用指针和非指针的区别

it2026-01-18  7

看码

package main import "fmt" type AddValue interface { changeName1() changeName2() } type cat struct { Name string } //更改所绑定的结构的字段值,非指针接收 func (c cat) changeName1(){ c.Name = "xiao_ming" fmt.Println("after changeName1, Name:",c.Name) } //更改所绑定的结构的字段值,指针接收 func (c *cat) changeName2(){ c.Name = "lao_wang" fmt.Println("after changeName2, Name:",c.Name) } func main(){ var a AddValue catTom := &cat{Name:"tom"} //初始化一个cat, Name的值设置为tom a = catTom a.changeName1() fmt.Println("after changeName, catTom name:",catTom.Name) //这里catTom的名字还是tom, 方法并没有改变它的值 a.changeName2() fmt.Println("after changeName, catTom name:",catTom.Name) //这里catTom的名字已经被修改了 }

代码很简单,定义两个方法接收固定的结构体,改结构体里面的Name字段的值, 一个改了,另外一个没有改。 结论:

使用指针方式接收,可以修改收到的结构的字段值, 不会随着函数的销毁而失效;使用非指针方式接收,只能在函数内部修改收到的结构的字段值, 函数被销毁,这个改变也就失效了;

斗胆猜测一下原理, 猜错了请指出…:

指针接收的话,应该是找到结构字段的地址,直接修改地址的值;非指针接收的话, 应该是在函数栈内部新建一个局部变量,给变量赋值,函数销毁资源也就释放,没有改变真正地址的值;
最新回复(0)