已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。
17小时前关门了。
Improve this question
我看到这段代码,想知道为什么object
可以同时是服务和Pod类型?
代码位于同一个函数体中。
serviceCreateHook := func(_ context.Context, client *MockClient, object ctrlClient.Object) error {
svc, isSvc := object.(*corev1.Service)
if !isSvc {
return nil
}
return nil
}
podCreateHook := func(_ context.Context, client *MockClient, object ctrlClient.Object) error {
pod, isPod := object.(*corev1.Pod)
if !isPod {
return nil
}
return nil
}
ctrlClient.Object
是k8s客户端对象接口,定义如下:
type Object interface {
metav1.Object
runtime.Object
}
我认为object.(*corev1.Pod)
使用类型Assert来获取接口对象的底层对象。但是为什么同一个接口可以是两种类型呢?
**后续问题:**给定一个object
,下面两个条件是否都为真?例如,计数器值是否为2?
{
counter := 0
pod, isPod := object.(*corev1.Pod)
if !isPod {
return nil
} else {
counter++
}
node, isNode := object.(*corev1.Node)
if !isNode {
return nil
} else {
counter++
}
}
1条答案
按热度按时间rqqzpn5f1#
TL;DR:
ctrlClient.Object
不能同时是两种类型,但ctrlClient.Object
的任何一个示例都可以是 * 任一种 * 类型。它还可以是也实现该接口的任何其他类型。
扩张
ctrlClient.Object
是一个接口类型。接口仅仅是一个契约,可以由任意数量的不同类型实现。您展示的两个“Hook”函数都接受该接口的任何实现,但在每种情况下,它们显然都具有(或将具有)依赖于该实现的特定底层类型的行为(函数在发布时似乎不完整,但这似乎是意图)。
因此,每个函数最初都在接口上执行类型Assert。
如果底层实现不是所需/期望的类型,那么与它是时相比,函数具有一些备选流。