问题描述
我在下面介绍了两个程序:程序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 (将#修改为@)