看下面一个例子:
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
}
两个方法Grow
和Move
的接受类型都是*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上。