一尘不染

如何在Kubernetes代码中满足&deployment满足类型runtime.Object?

go

kubectl/run.goKubernetes代码中,该Generate函数具有以下两种类型的结果列表:

runtime.Object, error

该函数的最后一行是:

return &deployment, nil

runtime 进口:

k8s.io/apimachinery/pkg/runtime

runtime通过go get在该import语句上运行而得到,对象在中定义interfaces.go

type Object interface {
    GetObjectKind() schema.ObjectKind
    DeepCopyObject() Object
}

(并且我在这里在网上找到了相同的代码。)

地址运算符会创建一个指针…更具体地说,Go规范指出:

对于类型T的操作数x,地址操作&x生成指向 T的类型 T的指针。

和指针的类型不同于其基本类型

指针类型表示指向给定类型的变量的所有指针的集合,称为指针的基本类型。

如何&deployment满足runtime.Object类型?

我最好的猜测,到目前为止是deployment实现了runtime.Object接口,并映射&deploymentruntime.Object满足可转让的这条规则

T是接口类型,并且x实现T。

在这方面,映射到结果列表类型的return语句语句等效于赋值。这样对吗?如果没有,规范或文档中是否还有其他部分对此进行了说明?


阅读 338

收藏
2020-07-02

共1个答案

一尘不染

deployment 是局部变量,其声明:

deployment := extensionsv1beta1.Deployment{
    // ...
}

extensionsv1beta1从哪里进口:

import (
    // ...
    extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
    // ...
)

的文档extensionsv1beta1.Deployment。其定义是:

type Deployment struct {
    metav1.TypeMeta `json:",inline"`
    // ...other fields...
}

它嵌入了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

2020-07-02