在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
类型吗?
答案 0 :(得分:0)
在“ 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的提升方法。
因此,鉴于嵌入式字段的方法是升级的,它们被包含在包含结构的方法集中。正如我们在上面看到的,任何类型的方法集是决定其是否实现接口的原因。