重构 golang 函数 - 应该使用什么类型?

请问你们中的任何人都可以告诉如何重构以下功能吗?


我想要一个功能,例如。getResource(name string, resourceType ????) []v1.?????,但不知道它的返回类型是什么。


func getPods(name string) []v1.Pod {

    pods, err := clientset.CoreV1().Pods(namespace).List(context.TODO(), getListOption(name))


    if err != nil {

        panic(err.Error())

    }

    return pods.Items

}


func getServices(name string) []v1.Service {

    services, err := clientset.CoreV1().Services(namespace).List(context.TODO(), getListOption(name))


    if err != nil {

        panic(err.Error())

    }

    return services.Items

}


小怪兽爱吃肉
浏览 138回答 1
1回答

UYOU

虽然调用几乎相同,内容也几乎相同,但它们的类型不同。 CoreV1().Pods(namespace).List是 :List(ctx context.Context, opts metav1.ListOptions) (*v1.PodList, error)但是CoreV1().Services(namespace).List是List(ctx context.Context, opts metav1.ListOptions) (*v1.ServiceList, error)一个返回 a *v1.PodList,另一个返回 a *v1.ServiceList。这两个不同的对象都有Items,但一个是 a []*Service,另一个是 a []*Pod。我个人会考虑不包装。我会改为调用底层函数,CoreV1在两种情况下都使用相同的客户端。我当然不会尝试将它们组合成一个功能。如果这里有什么要组合的,那就是命名空间和名称:type ByName struct {   Name string   Namespace string   v1 corev1.CoreV1Interface}func (b *ByName)Services(ctx context.Context) []v1.Service , error {   return b.v1.Services(namespace).List(ctx,  getListOption(b.Name))}func (b *ByName)Pods(ctx context.Context) []v1.Pod, error {  return b.v1.Pods(b.Namespace).List(ctx, getListOption(b.Name))}现在您不必传递名称和命名空间:b := &ByName{  Name: name,  Namespace: namespace,  v1: clientset.CoreV1(),}if svcs, err :=  b.Services(); err != nil {   return nil, err} else if pods, err := b.Pods(); err != nil {  return nil, err} else {  ... continue processing}而且您无需进行大量类型检查即可获得所需的简洁性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go