簡體   English   中英

如何制作適用於 k8s package 的任何類型的 function?

[英]How can I make a function that works on any type from the k8s package?

抱歉,我對 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

所以我有點卡住了。 我注定要為每種類型復制+粘貼相同的 function 還是我正在犯的一個簡單的語法錯誤?

幾乎答案是使用非結構化包

我不認為你可以在沒有具體類型的情況下執行client.Get() ,這很荒謬。 Go 真的是一種僵硬而冗長的語言,不是嗎?

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 將是您嘗試從集群中獲取的資源,它應該作為結構指針在 function 中傳遞。

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

這里的資源應該是一個結構,如Get、delete 等。期望作為指向要傳遞的相應 object 的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM