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