請問有人能告訴我如何重構以下函式嗎?
我想要一個功能,例如。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
}
uj5u.com熱心網友回復:
雖然呼叫幾乎相同,內容也幾乎相同,但它們的型別不同。 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
}
而且您無需進行大量型別檢查即可獲得所需的簡潔性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352544.html
標籤:走 Kubernetes
下一篇:在GO中解組嵌套的JSON物件
