抱歉,我对 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 等期望作为指向要传递的相应对象的指针。
- 2 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消