jre*_*ior 3 methods pointers interface go kubernetes
在kubectl/run.goKubernetes代码中,该Generate函数具有以下两种类型的结果列表:
runtime.Object, error
Run Code Online (Sandbox Code Playgroud)
该函数的最后一行是:
return &deployment, nil
Run Code Online (Sandbox Code Playgroud)
runtime 进口:
k8s.io/apimachinery/pkg/runtime
Run Code Online (Sandbox Code Playgroud)
我runtime通过go get在该import语句上运行而得到,对象在中定义interfaces.go:
type Object interface {
GetObjectKind() schema.ObjectKind
DeepCopyObject() Object
}
Run Code Online (Sandbox Code Playgroud)
(并且我在这里在网上找到了相同的代码。)
地址运算符创建了一个指针……更具体地说,Go规范指出:
对于类型T的操作数x,地址操作&x生成指向* x的类型* T的指针。
和指针的类型与其基本类型不同:
指针类型表示指向给定类型的变量的所有指针的集合,称为指针的基本类型。
如何&deployment满足runtime.Object类型?
我最好的猜测,到目前为止是deployment实现了runtime.Object接口,并映射&deployment到runtime.Object满足可转让的这条规则:
T是接口类型,并且x实现T。
在这方面,映射到结果列表类型的return语句语句等效于赋值。它是否正确?如果没有,规范或文档中是否还有其他部分对此进行了说明?
deployment 是局部变量,其声明:
deployment := extensionsv1beta1.Deployment{
// ...
}
Run Code Online (Sandbox Code Playgroud)
extensionsv1beta1从哪里进口:
import (
// ...
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
// ...
)
Run Code Online (Sandbox Code Playgroud)
的文档extensionsv1beta1.Deployment。其定义是:
type Deployment struct {
metav1.TypeMeta `json:",inline"`
// ...other fields...
}
Run Code Online (Sandbox Code Playgroud)
它嵌入了metav1.TypeMeta,它有一个GetObjectKind()带有指针接收器的方法。这意味着指向的指针Deployment也具有此方法,因为Spec:Struct类型:
给定一个结构类型
S和一个定义的类型T,提升的方法包括在结构的方法集中,如下所示:
- 如果
S包含一个嵌入式字段T,则S和的方法集*S都包括带有接收者的提升方法T。方法集*S还包括带有接收方的提升方法*T。
并Deployment具有“直接” DeepCopyObject()方法,再次使用指针接收器。因此,设置方法的*Deployment包含此方法。
最后引用Spec:接口类型:
接口类型指定一个称为其接口的方法集。接口类型的变量可以使用接口的任何超集的方法集来存储任何类型的值。据说这种类型实现了接口。
因此,这意味着的方法集*Deployment具有定义的所有方法Object,或换句话说:的方法集*Deployment是的方法集的超集Object,因此*Deployment实现了Object。
deployment是类型的extensionsv1beta1.Deployment,这意味着&deployment类型*extensionsv1beta1.Deployment,我们在上面展示了它的实现Object; 因此,该值&deployment可以分配给或存储在type变量中Object。