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)
顺便说一句,代码正在运行,我们只是想让它更简单、更清晰......