我在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 –