我在Golang的世界里有2天的历史,并且通过去参观。我忍不住注意到一个特殊的地方,我似乎无法用恰当的推理来达到目的。为什么我不能将类型的值赋给接口类型指针实现方法的接口?
该代码是完全运行:
package main
import (
"fmt"
"math"
)
type Vertex struct{
X,Y float64
}
type Abser interface{
Abs() float64
}
func (v Vertex) Abs() float64{ //method with value receiver argument
return math.Sqrt(v.X*v.X+v.Y*v.Y)
}
func main(){
var myVer Vertex = Vertex{3,4}
var inter Abser
inter = &myVer //assigning *Vertex type to inter
fmt.Println(inter.Abs())
}
同时,下面的代码显示一个错误:
package main
import (
"fmt"
"math"
)
type Vertex struct{
X,Y float64
}
type Abser interface{
Abs() float64
}
func (v *Vertex) Abs() float64{ //method with pointer receiver argument
return math.Sqrt(v.X*v.X+v.Y*v.Y)
}
func main(){
var myVer Vertex = Vertex{3,4}
var inter Abser
inter = myVer //assigning Vertex type to inter
fmt.Println(inter.Abs())
}
错误是:
interface.go:18: cannot use myVer (type Vertex) as type Abser in assignment: Vertex does not implement Abser (Abs method has pointer receiver)
直到达到的这一部分我可以理解Go的创作者已经放弃了诸如
(*v).method1name()
(&v).method2name()
因此,具有值接收器的方法可以与值和指针一起使用,反之亦然。
为什么语言在使用接口时会区分两者(值和指针)?如果在这里可以应用相同的参考/解引用原则,不是更方便吗?
我希望我不会错过太明显的东西。 谢谢!
我来这里讨论相同的例子。我无法把头围住它。它在这里:https://tour.golang.org/methods/9 –