选择值或指针作为接收者

使用指针接收者的原因有二:

首先,方法能够修改其接收者指向的值。

其次,这样可以避免在每次调用方法时复制该值。若值的类型为大型结构体时,这样做会更加高效。

在本例中,ScaleAbs 接收者的类型为 *Vertex,即便 Abs 并不需要修改其接收者。

通常来说,所有给定类型的方法都应该有值或指针接收者,但并不应该二者混用。(我们会在接下来几页中明白为什么。)

methods-with-pointer-receivers.go

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