即使结构指针未实现接口,为什么我们仍可以将结构指针分配给接口变量? 程序1 程序2

问题描述

我在下面介绍了两个程序:程序1和程序2。

我希望程序1无法编译,并且确实无法编译。这样很好。

我希望程序2无法编译,但可以成功!这个问题是关于程序2成功的原因。

程序1

https://play.golang.org/p/qX9nY8VLlx0

package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

type Vertex struct {
    X float64
    Y float64
}

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

func main() {
    var a Abser
    
    a = Vertex{3,4}
    fmt.Println(a.Abs())
}

无法通过此错误进行编译:

./prog.go:24:4: cannot use Vertex literal (type Vertex) as type Abser in assignment:
Vertex does not implement Abser (Abs method has pointer receiver)

我之所以会遇到此错误,是因为*Vertex实现了Abser,但Vertex没有实现,因此我们无法将Vertex对象分配给Abser变量。 / p>

程序2

https://play.golang.org/p/4bIs-fHGhYm

package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

type Vertex struct {
    X float64
    Y float64
}

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

func main() {
    var a Abser
    
    a = &Vertex{3,4}
    fmt.Println(a.Abs())
}

这将成功编译。该程序的输出为:

5

为什么成功?在这里,Vertex实现了Abser,但是*Vertex没有实现Abser。然后如何为*Vertex分配类型为Abser的值?

要知道为什么成功,我需要了解哪些语言语义规则?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)