Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go结构中的意外行为_Go_Embedding - Fatal编程技术网

Go结构中的意外行为

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 } /

我在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
}
// 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的两种实现,但在第一种情况下需要使用指针。例如