下面我们写一段代码为Vertex类型的结构体定义一个指针接收者方法scale()

package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

// 指针接收者的方法可以修改接收者指向的值
func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(10)
	fmt.Println(v)
	fmt.Println(v.Abs())
}

打印输出的结果是:

{30 40}
50

我们修改scale()方法为值接收者

// 值接收者的方法只会对原始值的副本进行操作
func (v Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

打印输出的结果是:

{3 4}
5

可见:值接收者并不会修改Vertex的值,由此得出结论:指针接收者的方法可以修改接收者指向的值,值接收者的方法只会对原始值的副本进行操作