Go 匿名/显式嵌入结构中的接口
B结构和C结构有什么不同 进料单 用类型声明但没有显式字段名的字段称为嵌入字段。嵌入字段必须指定为类型名T或指向非接口类型名*T的指针,并且T本身不能是指针类型。非限定类型名用作字段名Go 匿名/显式嵌入结构中的接口,go,interface,Go,Interface,B结构和C结构有什么不同 进料单 用类型声明但没有显式字段名的字段称为嵌入字段。嵌入字段必须指定为类型名T或指向非接口类型名*T的指针,并且T本身不能是指针类型。非限定类型名用作字段名 如果继续阅读相同的规范,您将注意到以下几点: 给定结构类型S和定义的类型T,升级的方法是 包含在结构的方法集中,如下所示: 如果S包含一个嵌入字段T,则该方法将同时设置S和*S 包括接收器T的提升方法。方法集*S也 包括使用receiver*T的升级方法 如果S包含嵌入的 字段*T,S和*S的方法集都包括提升的
如果继续阅读相同的规范,您将注意到以下几点: 给定结构类型S和定义的类型T,升级的方法是 包含在结构的方法集中,如下所示:
- 如果S包含一个嵌入字段T,则该方法将同时设置S和*S 包括接收器T的提升方法。方法集*S也 包括使用receiver*T的升级方法
- 如果S包含嵌入的 字段*T,S和*S的方法集都包括提升的方法 带接收器T或*T
B
上没有明确定义的方法,但是B
的方法集隐式地包含来自嵌入字段的提升方法。在这种情况下,嵌入字段是方法f()
的接口。您可以使用满足该接口的任何对象,其f()
方法将自动成为B
方法集的一部分
另一方面,C
struct有一个命名字段Imp上的方法不会自动添加到C
的方法集。相反,要从Imp
访问f()
方法,需要专门调用C.Imp.f()
最后:使用接口作为(嵌入式或非嵌入式)字段并不重要,它很可能是另一个具有
f()
方法的结构重要的部分是f()
是否成为父结构的方法集的一部分,这将允许它实现A
。这与嵌入接口无关。嵌入任何类型都会显示完全相同的行为,这是计算方法集的结果。
type A interface {
f()
}
type B struct {
A
}
type C struct {
Imp A
}
func main() {
b := B{}
c := C{}
//b can be directly assigned to the A interface, but c prompts that it cannot be assigned
var ab A = b
//Cannot use 'c' (type C) as type A in assignment Type does not implement 'A' as some methods are missing: f()
var ac A = c
}