关于接口的方法实现

时间:2018-05-10 02:39:21

标签: go

任何人都可以解释为什么调用a.Abs()有效吗? 在我看来,' a'是* Vertex类型的变量,但* Vertex类型不实现方法Abs。

package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

func main() {
    var a Abser

    v := Vertex{3, 4}
    a = &v // a *Vertex implements Abser
    // In the following line, v is a *Vertex (not Vertex)
    // and does NOT implement Abser, but why does this calling work?
    fmt.Println(a.Abs())

}

type Vertex struct {
    X, Y float64
}

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

1 个答案:

答案 0 :(得分:5)

来自here

  

方法集
  [...]相应指针类型* T的方法集是使用receiver * T或T声明的所有方法的集合(也就是说,它还包含T的方法集)。 [...]

您的Abs函数位于Vertex*Vertex的方法集中,因此*Vertex就像Abser一样Vertex

其他相关部分:

一般情况下,指针会尽可能自动取消引用,因此您可以说出x.M()x.V,而无需担心x是否为指针而且不需要C&#39 ; s ->或手动解除引用(即(*x).M()(*x).V)。