golang语法系列4-指针方法和值方法对比

1.结构体内容

1.1.结构体的指针方法

如下,定义了一个Person(人)的结构体,包含Name(名字)、Gender(性别)、Age(年龄)、Address(地址)共4个字段;

type Person struct {
    Name    string
    Gender  string
    Age     uint8
    Address string
}
func (person *Person) Grow() {
    person.Age++
}
 
func (person *Person) Move(newAddress string) string {
    old := person.Address
    person.Address = newAddress
    return old

1.2.结构体值方法

如下,定义了一个Person(人)的结构体,包含Name(名字)、Gender(性别)、Age(年龄)、Address(地址)共4个字段;

type Person struct {
    Name    string
    Gender  string
    Age     uint8
    Address string
}
func (person Person) Grow() {
    person.Age++
}

2.分析指针方法和值的方法

p := Person{"Robert", "Male", 33, "Beijing"}
p.Grow()
fmt.Printf("%v\n", p)  

1.如果是上述1.1结构体指针方法,打印34;
2.如果是上述1.2结构体值方法,打印33;

为什么?
对于值类型方法来说,接受的标识符是值的一个拷贝的副本,不是值本身。执行Grow方法的person.Age++语句,会使副本的Age值变为34,但是打印的p的Age还是33(因为他们两个并不是一个实例,另一个只是个副本)。

当我们把Grow方法变成指针方法后,打印的值就变成34了,因为此时传递的值是指针的副本,指针的副本任然指向p的值。所以累加操作会作用到person.Age上。

参考:
golang结构体和指针
https://blog.youkuaiyun.com/xiangxianghehe/article/details/78387722
golang 的指针和非指针方法的见解
https://blog.youkuaiyun.com/qq_21816375/article/details/78161723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值