理解Go中带有接口和指针的类型断言

时间:2017-04-23 10:44:32

标签: go

让我们考虑以下计划

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)

这里有什么用?

1 个答案:

答案 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))
}