Go结构中的意外行为

时间:2018-10-16 14:08:44

标签: go embedding

我在Go结构中遇到了奇怪的行为。我可能会误会一些东西,但是当我这样创建时:

type ITest interface {
    Foo() string
    Bar(string)
}

type Base struct {
    value string
}

func (b Base) Foo () string {
    return b.value
}

func (b *Base) Bar (val string) {
    b.value = val
}
// Not implementing ITest
type Sub struct {
    Base
}
// Now it works
type Sub struct {
    *Base
}

然后Sub未实现ITest。但是,如果我将Sub更改为嵌入Base的指针,它将开始实现ITest。我知道它在某种程度上与方法中的调用者有关,但是来吧。所以问题是:我错了还是Go嵌入逻辑有问题?

1 个答案:

答案 0 :(得分:1)

*Base具有方法Bar,但Base没有;因此Base无法实现ITest。因此,嵌入*Base允许Sub实现该接口。

您使用名称BaseSub也意味着您可能正在混用组合和继承,在Go中应格外小心。 Go中没有继承。没有基类,没有子类,没有类层次结构,没有继承。 go中的 only 多态形式是接口。