嵌入式字段是否计入接口

时间:2019-01-11 20:11:37

标签: go

在Golang中,我可以在struct内嵌入字段。嵌入字段被“提升”,新的struct可以使用嵌入字段的所有功能,就好像它是其自身的一部分一样。所以我的问题是,嵌入式字段的功能是否算作接口实现?例如:

type Foo struct {
    Name string
}

func (f *Foo) Name() {
    fmt.Println(f.Name)
}

type Hello interface {
    Name()
    Hello()
}

type Bar struct {
    World string
    *Foo
}

func (b *Bar) Hello() {
    fmt.Println("Hello")
}

在上面的代码中,Bar{}没有实现名为Name()的函数,但是Foo{}却实现了。由于Foo{}Bar{}内部的嵌入字段,因此Bar{}Hello类型吗?

1 个答案:

答案 0 :(得分:0)

这是在language specification

中进行跟踪的方法

在“ Interface types”部分中了解实现接口的含义:

  

接口类型      

接口类型指定一个称为其接口的方法集。一种   接口类型的变量可以使用方法存储任何类型的值   设置为界面的任何超集。据说这种类型   实现接口。

或者在“ Method sets”部分

  

类型的方法集确定该类型实现的接口...

所以重要的是要实现接口的类型的方法集。让我们看看在嵌入字段的情况下构成方法集的原因:

我检查的第一个地方是“ Method Sets”部分,但它会将我们发送到其他地方:

  

其他规则适用于包含嵌入式字段的结构,如有关结构类型的部分所述。

因此,我们进入“ Struct types”部分并找到:

  

结构x中嵌入字段的字段或方法f被称为   如果x.f是表示该字段或方法的合法选择器,则提升   f。

     

...

     

鉴于结构类型S和定义的类型T,提升的方法是   包含在结构的方法集中的方法如下

     
      
  • 如果S包含嵌入字段T,则S和* S的方法集都包括接收者T的提升方法。* S的方法集也包括接收者* T的提升方法。
  •   
  • 如果S包含一个嵌入字段* T,则S和* S的方法集都包括接收者T或* T的提升方法。
  •   

因此,鉴于嵌入式字段的方法是升级的,它们包含在包含结构的方法集中。正如我们在上面看到的,任何类型的方法集是决定其是否实现接口的原因。