【发布时间】:2016-11-05 03:15:25
【问题描述】:
我在 Golang 世界里已经 2 天了,并且正在经历 go tour。我不禁注意到一个我似乎无法通过适当推理来达成一致的特殊性。
这段代码运行完美:
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:不能在赋值中使用 myVer(类型 Vertex)作为类型 Abser: Vertex没有实现Abser(Abs方法有指针接收器)
直到游览的这一部分,我才明白围棋的创造者已经放弃了像这样的繁琐符号
(*v).method1name()
(&v).method2name()
这样带有值接收器的方法可以同时用于值和指针,反之亦然。
为什么在使用接口时语言会区分两者(值和指针)?如果在这里可以应用相同的引用/取消引用原则,会不会更方便?
我希望我没有遗漏一些太明显的东西。 谢谢!
【问题讨论】:
-
我来这里是为了讨论同一个例子。我无法绕过它。在这里:tour.golang.org/methods/9
标签: go