【Go】方法和指针

go 方法和指针

指针参数

函数参数若为指针,则必须传指针作为参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Vertex struct {
X, Y float64
}

func Abs(v *Vertex, f float64) {
v.X = v.X + f
v.Y = v.Y + f
}

func main() {
var v Vertex
Abs(v, 5)
Abs(&v, 5)
}

第12行 会产生编译错误,原因是 Abs函数的第一个参数是 指针,但是却传的是值
第13行 是正确的

指针接收者

方法接收者若为指针,则接收者既可为指针,亦可为值

接上面的代码测试

1
2
3
4
5
6
7
8
9
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * F
}

var v Vertex
v.Scale(1)
s := &v
s.Scale(2)

上面第7、9行代码可行, go会自动将 s.Scale(2) 解释为 (&s).Scale(2)

值与指针接收者

值接收者在调用的时候,会复制该值,对值接收者的修改仅是修改该复制的值而已

而且当值为复杂结构时,复制是个低效率的操作

因此指针作为接收者,会是更有效

坚持原创技术分享,谢谢鼓励我继续创作!