让我们考虑以下计划
type Fruit interface {
Color() string
}
type Apple struct {
color string
}
func (x *Apple) Color() string {
return x.color
}
func (x *Apple) Compare(y Fruit) bool {
_, ok := y.(*Apple)
if ok {
ok = y.Color() == x.Color()
}
return ok
}
func main() {
a := Apple{"red"}
b := Apple{"green"}
a.Compare(&b)
}
现在,请注意最后一行a.Compare(&b)
。在这里,我传递一个指向Apple
的指针。这可以正确,但请注意我的Compare
函数不接受指针(y Fruit)
。
现在,如果我将最后一行更改为a.Compare(b)
,那么它会给我以下错误:
cannot use b (type Apple) as type Fruit in argument to a.Compare:
Apple does not implement Fruit (Color method has pointer receiver)
这里有什么用?
答案 0 :(得分:3)
出于this answer中列出的原因,Apple
未实现Fruit
,但*Apple
不实现。如果您在Color
(而非Apple
)上定义*Apple
,则代码会编译:
package main
import (
"fmt"
)
type Fruit interface {
Color() string
}
type Apple struct {
color string
}
func (x Apple) Color() string {
return x.color
}
func (x Apple) Compare(y Fruit) bool {
_, ok := y.(Apple)
if ok {
ok = y.Color() == x.Color()
}
return ok
}
func main() {
a := Apple{"red"}
b := Apple{"green"}
fmt.Println(a.Compare(b))
}