任何人都可以解释为什么调用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)
}
答案 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
)。