指针接收者

你可以为指针接收者声明方法。

这意味着对于某类型 T,接收者的类型可以用 T 的文法。(此外,T 不能是像 int 这样的指针。)

例如,这里为 *Vertex 定义了 Scale 方法。

指针接收者的方法可以修改接收者指向的值(就像 Scale 在这做的)。由于方法经常需要修改它的接收者,指针接收者比值接收者更常用。

试着移除第 16 行 Scale 函数声明中的 *,观察此程序的行为如何变化。

若使用值接收者,那么 Scale 方法会对原始 Vertex 值的副本进行操作。(对于函数的其它参数也是如此。)Scale 方法必须用指针接受者来更改 main 函数中声明的 Vertex 的值。

methods-pointers.go

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type Vertex struct {
  7. X, Y float64
  8. }
  9. func (v Vertex) Abs() float64 {
  10. return math.Sqrt(v.X*v.X + v.Y*v.Y)
  11. }
  12. func (v *Vertex) Scale(f float64) {
  13. v.X = v.X * f
  14. v.Y = v.Y * f
  15. }
  16. func main() {
  17. v := Vertex{3, 4}
  18. v.Scale(10)
  19. fmt.Println(v.Abs())
  20. }