我怎样才能创建一个适用于 k8s 包中任何类型的函数?

抱歉,我对 Go 很陌生,所以希望这不是一个愚蠢的问题。我知道一般意义上的指针,但在 Go 语义上苦苦挣扎。


我无法让它工作:


func DeleteOldCronJob(c client.Client, ctx context.Context, namespace string, name string) error {

    cronJob := batchv1beta1.CronJob{}

    key := client.ObjectKey{

        Namespace: namespace,

        Name:      name,

    }

    return DeleteOldAny(c, ctx, name, key, &cronJob)

}


func DeleteOldAny(c client.Client, ctx context.Context, name string, key client.ObjectKey, resource interface{}) error {

    err := c.Get(ctx, key, resource)


    if err == nil {

        err := c.Delete(ctx, resource)

        if err != nil {

            return err

        }

    } else {

        return err

    }


    return nil

}

我得到一个错误:


interface {} does not implement "k8s.io/apimachinery/pkg/runtime".Object (missing DeepCopyObject method)

关键是我可以在多种不同类型上重用 DeleteOldAny,使我的代码库更紧凑(我可以只复制+粘贴 DeleteOldCronjob 并更改类型)。据我所知,Go 中指向接口的指针通常是错误的。另外,我导入的 k8s 类型只是一个结构。所以,我想既然它是一个结构而不是一个接口,我应该像这样传递资源 aa 指针:


        err := c.Get(ctx, key, &resource)

但这给了我另一个错误:


*interface {} is pointer to interface, not interface

所以我有点卡住了。我是注定要为每种类型复制+粘贴相同的函数,还是我犯了一个简单的语法错误?


莫回无
浏览 80回答 2
2回答

幕布斯7119047

func (client.Reader).Get(ctx context.Context, key types.NamespacedName, obj client.Object) errorGet retrieves an obj for the given object key from the Kubernetes Cluster. obj must be a struct pointer so that obj can be updated with the response returned by the Server.所以采用模块化方法并停止重复使用代码的想法是正确的。但是实现是错误的,obj 将是你试图从集群中获取的资源,它应该作为结构指针传递给函数。err := c.Get(ctx, key, &resource)这里的资源应该是一个结构,如Get、delete 等期望作为指向要传递的相应对象的指针。

暮色呼如

几乎答案是使用非结构化包。我认为你不能client.Get()没有具体的类型,这很荒谬。Go 确实是一种生硬冗长的语言,不是吗?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go