方法与指针重定向(续)

同样的事情也发生在相反的方向。

接受一个值作为参数的函数必须接受一个指定类型的值:

  1. var v Vertex
  2. fmt.Println(AbsFunc(v)) // OK
  3. fmt.Println(AbsFunc(&v)) // 编译错误!

而以值为接收者的方法被调用时,接收者既能为值又能为指针:

  1. var v Vertex
  2. fmt.Println(v.Abs()) // OK
  3. p := &v
  4. fmt.Println(p.Abs()) // OK

这种情况下,方法调用 p.Abs() 会被解释为 (*p).Abs()

indirection-values.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 AbsFunc(v Vertex) float64 {
  13. return math.Sqrt(v.X*v.X + v.Y*v.Y)
  14. }
  15. func main() {
  16. v := Vertex{3, 4}
  17. fmt.Println(v.Abs())
  18. fmt.Println(AbsFunc(v))
  19. p := &Vertex{4, 3}
  20. fmt.Println(p.Abs())
  21. fmt.Println(AbsFunc(*p))
  22. }