Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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_Interface - Fatal编程技术网

Go 匿名/显式嵌入结构中的接口

Go 匿名/显式嵌入结构中的接口,go,interface,Go,Interface,B结构和C结构有什么不同 进料单 用类型声明但没有显式字段名的字段称为嵌入字段。嵌入字段必须指定为类型名T或指向非接口类型名*T的指针,并且T本身不能是指针类型。非限定类型名用作字段名 如果继续阅读相同的规范,您将注意到以下几点: 给定结构类型S和定义的类型T,升级的方法是 包含在结构的方法集中,如下所示: 如果S包含一个嵌入字段T,则该方法将同时设置S和*S 包括接收器T的提升方法。方法集*S也 包括使用receiver*T的升级方法 如果S包含嵌入的 字段*T,S和*S的方法集都包括提升的

B结构和C结构有什么不同

进料单

用类型声明但没有显式字段名的字段称为嵌入字段。嵌入字段必须指定为类型名T或指向非接口类型名*T的指针,并且T本身不能是指针类型。非限定类型名用作字段名


如果继续阅读相同的规范,您将注意到以下几点:

给定结构类型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
}