为什么接口分配比方法调用更严格?

Mut*_*thm 5 interface go

我正在经历围棋之旅。我了解到,如果我们有一个接受指针作为接收器的方法,它也会接受一个值类型作为接收器(go 会自动进行转换)。

type Vertex struct { X, Y float64 }

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X * v.X + v.Y * v.Y)
}
Run Code Online (Sandbox Code Playgroud)

那么下面的代码是有效的,无论Vertex是按值还是按指针接收

v := Vertex{1, 2}
fmt.Println(v.Abs())

p := &v
fmt.Println(p.Abs())
Run Code Online (Sandbox Code Playgroud)

但是,假设我们有以下接口:

type Abser interface {
    Abs() float64
}
Run Code Online (Sandbox Code Playgroud)

那么,为什么下面的代码无效呢?

var a Abser
v := Vertex{1, 2}

a = v // invalid
Run Code Online (Sandbox Code Playgroud)

我的理解是这样就好了。即使 v 是“实现”接受指针接收器的 Abs 函数的值类型,它也会按值接受它?

就接口变量可以在右侧保存的内容而言,接口是否只是设计得更加严格?该接口将 *Vertex 和 Vertex 视为两种不同的类型,但是, Abs() 方法也没有问题处理。