我在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嵌入逻辑有问题?
答案 0 :(得分:1)
*Base
具有方法Bar
,但Base
没有;因此Base
无法实现ITest
。因此,嵌入*Base
允许Sub
实现该接口。
您使用名称Base
和Sub
也意味着您可能正在混用组合和继承,在Go中应格外小心。 Go中没有继承。没有基类,没有子类,没有类层次结构,没有继承。 go中的 only 多态形式是接口。