看一下如下的例子,就能理解了:
package main
import (
"fmt"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func (v Vertex) Scale2(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func main() {
v := Vertex{3, 4}
v.Scale(10)
fmt.Println(v)
v.Scale2(10)
fmt.Println(v)
p := &Vertex{3, 4}
p.Scale(10)
fmt.Println(*p)
p.Scale2(10)
fmt.Println(*p)
}
结果为:
{30 40}
{30 40}
{30 40}
{30 40}
从上面可以观察:
第一个scale起了作用,而第二个scale无作用,无论是变量调用还是指针调用都没有作用。
再次总结:
1.指针接收者的方法,无论是变量来调用,还是变量指针来调用,都能更改底层的数据。
2.而值接收者的方法,无论是变量来调用,还是变量指针来调用,都不能更改底层的数据。
3.是否能改变底层数据是与方法中的接收者类型有关,而跟变量或者指针的调用无关。
4.无论变量还是指针变量都能使用"."来对方法进行调用
5.在书写方法时候,尽量使用指针接收者,这样不仅仅可以更改底层的数据,还可以避免在每次调用方法时复制该值。若值的类型为大型结构体时,这样做会更加高效