Go语言 同一个Object接口可以是不同类型吗?[已关闭]

6jjcrrmo  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(117)

已关闭。此问题需要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++
            }
}
rqqzpn5f

rqqzpn5f1#

TL;DR:

ctrlClient.Object不能同时是两种类型,但ctrlClient.Object的任何一个示例都可以是 * 任一种 * 类型。
它还可以是也实现该接口的任何其他类型。

扩张

ctrlClient.Object是一个接口类型。接口仅仅是一个契约,可以由任意数量的不同类型实现。
您展示的两个“Hook”函数都接受该接口的任何实现,但在每种情况下,它们显然都具有(或将具有)依赖于该实现的特定底层类型的行为(函数在发布时似乎不完整,但这似乎是意图)。
因此,每个函数最初都在接口上执行类型Assert。
如果底层实现不是所需/期望的类型,那么与它是时相比,函数具有一些备选流。

相关问题