Go结构中的意外行为
我在Go structs中遇到了一个奇怪的行为。我可能误解了一些事情,但当我这样创作时:Go结构中的意外行为,go,embedding,Go,Embedding,我在Go structs中遇到了一个奇怪的行为。我可能误解了一些事情,但当我这样创作时: 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 } /
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改为嵌入基的指针,它将开始实现ITest。我知道它在某种程度上与方法中的调用者有关,但别这样。所以问题是:是我出错了还是我在嵌入逻辑方面有问题?*Base有一个方法栏,但Base没有;所以Base并没有实现ITest。因此,嵌入*Base允许Sub实现接口
使用名称Base和Sub还意味着可能将组合和继承混为一谈,在Go中应该非常小心。围棋没有继承权。没有基类,没有子类,没有类层次结构,没有继承。go中多态的唯一形式是接口。参见答案的第二部分:结构和嵌入。另外:可以同时使用Sub的两种实现,但在第一种情况下需要使用指针。例如