为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
小怪兽爱吃肉 2022-10-10 19:23:23
请问你们中的任何人都可以告诉如何重构以下功能吗?我想要一个功能,例如。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}
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

虽然调用几乎相同,内容也几乎相同,但它们的类型不同。 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

}

而且您无需进行大量类型检查即可获得所需的简洁性。



查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信