为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
莫回无 2022-12-26 10:48:01
抱歉,我对 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所以我有点卡住了。我是注定要为每种类型复制+粘贴相同的函数,还是我犯了一个简单的语法错误?
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

func (client.Reader).Get(ctx context.Context, key types.NamespacedName, obj client.Object) error

Get 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 等期望作为指向要传递的相应对象的指针。


查看完整回答
反对 回复 2022-12-26
?
暮色呼如

TA贡献1853条经验 获得超9个赞

几乎答案是使用非结构化包

我认为你不能client.Get()没有具体的类型,这很荒谬。Go 确实是一种生硬冗长的语言,不是吗?


查看完整回答
反对 回复 2022-12-26
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信