Go 类型的指针方法和值方法

看下面一个例子:

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
}

两个方法GrowMove的接受类型都是*Person,而不是Person

一个方法的接受类型是所属类型的指针类型,就可以称此方法为指针方法。

Grow和Move都是Person 的指针方法。

如果接受类型是所属类型本身,此方法叫做值方法。 如:

func (person Person) Grow() {
    person.Age++
}

指针方法和值方法有什么区别? 看个例子:

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

这个打印结果直觉上是34,但其实是33,为什么?

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

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

转载于:https://my.oschina.net/u/1000241/blog/3044930

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值