在这两个教程示例中,为什么带指针接收器的方法在一种情况下满足接口而在另一种情况下不满足另一种情况?
在example #55中,班级Vertex
并不满足Abser
界面,因为方法Abs
仅定义为*Vertex
而不是{{1} }}:
Vertex
错误消息是:
type Abser interface {
Abs() float64
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
但在example #57中,即使为prog.go:22: cannot use v (type Vertex) as type Abser in assignment:
Vertex does not implement Abser (Abs method has pointer receiver)
而非MyError
定义了error
,班级Error()
也能满足*MyError
界面的要求:
MyError
从this answer中的描述看起来两者都应该可以正常工作,但是教程演示了第一个失败。有什么区别?
答案 0 :(得分:6)
在example57中,错误返回如下:
return &MyError{
time.Now(),
"it didn't work",
}
这将返回指向MyError结构的指针。 *MyError
满足界面。
在例55中,也指出了这一点:
a = &v // a *Vertex implements Abser
// In the following line, v is a Vertex (not *Vertex)
// and does NOT implement Abser.
a = v
正如你所指的答案中所述,生成发生在相反的情况下(*MyStruct
类型将具有所有方法MyStruct
)
答案 1 :(得分:3)
在#57中,只有*MyError
符合error
。如您所见,run()
返回的值为*MyError
,而不是MyError
:
func run() error {
return &MyError{ // <<< Notice the '&'.
time.Now(),
"it didn't work",
}
}
答案 2 :(得分:3)
在#57中,它返回一个指向我的错误的指针:
return &MyError{ //notice the "&", that means return the address / pointer to that struct.
time.Now(),
"it didn't work",
}