go-generics :将实现 client.Object 的对象列表转换为列表

Alb*_*rto 5 generics polymorphism go kubernetes-go-client

我们有以下类型,它是通用资源列表,该结构有 4 个通用参数(全部与对象列表指针类型相关),但我找不到减少它的方法。

import(
  ...
   "sigs.k8s.io/controller-runtime/pkg/client"
) 

type GenResourceLister[OBJ any, OBJPTR interface {
    client.Object
    *OBJ
}, LIST interface {
    GetItems() []OBJ
}, LISTPTR interface {
    client.ObjectList
    *LIST
}] struct{}
Run Code Online (Sandbox Code Playgroud)

以下函数有 2 个泛型参数,其中一个是切片参数的元素类型,但我认为另一个(其指针类型)会阻止类型推断,因此必须在每次调用时指定参数。我找不到摆脱它们的方法。

// itemsToObjectList converts a list of objects whose pointer
// type implements client.Object to a list of client.Object

func itemsToObjectList[T any, TPTR interface {
    client.Object
    *T
}](items []T) []client.Object {
    objs := make([]client.Object, 0, len(items))
    for _, resource := range items {
        resource := resource
        objs = append(objs, TPTR(&resource))
    }
    return objs
}




func (l *GenResourceLister[OBJ, OBJPTR, LIST, LISTPTR]) ListResources(
    context context.Context, 
    cli client.Client, 
    listOptions *client.ListOptions
) ([]client.Object, error) {
    resources := new(LIST)
    if err := cli.List(context, LISTPTR(resources), listOptions); err != nil {
        return nil, err
    }
    items := (*resources).GetItems()
    return itemsToObjectList[OBJ, OBJPTR](items), nil
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,代码正在运行,我们只是想让它更简单、更清晰......