【问题标题】:Converting/typecasting go interface object to concrete type将 go 接口对象转换/类型转换为具体类型
【发布时间】:2019-08-12 04:48:40
【问题描述】:

informer 的实现中,可以提供如下事件处理程序。

podInformer.AddEventHandler(cache.ResourceEventHandlerFuncs {
   // When a new pod gets created
   AddFunc: func(obj interface{}) {
       k8s.handleAddPod(obj)
   },
   // When a pod gets updated
   UpdateFunc: func(oldObj interface{}, newObj interface{}) {
       k8s.handleUpdatePod(oldObj, newObj)
   },
   // When a pod gets deleted
   DeleteFunc: func(obj interface{}) {
       k8s.handleDeletePod(obj)
   },
})

这是处理Pod 相关事件的示例事件处理程序。到目前为止,我已经编写了如下处理程序;但是,它无法读取对象。

我无法将 obj interface{} 类型转换为 v1.Pod 并且尝试读取它失败。标志ok 的值即将出现false。有人可以建议这段代码中缺少什么吗?

func (k8s *K8S) handleAddPod(obj interface{}) {
    pod, ok := obj.(v1.Pod)
    if ok {
        log.Debug("Status: " + string(pod.Status.Phase))
        log.Debug("Pod added: " + pod.Name + " " + pod.DeletionTimestamp.String())
    }
}

【问题讨论】:

  • 调试,fmt.Printf(“obj: %T”, obj) 找到实际的具体类型。该问题使用类型断言,而不是转换或类型转换。
  • 能否详细说明。我比较陌生,可以在工作中学习它。我尝试打印 %T,我看到了这个 (2019-08-11T22:58:19-07:00 DBG k8s.go:1530: obj: *v1.Pod)。
  • 输出显示它是一个指针,obj.(*v1.Pod) 也是如此,而不是 obj.(v1.Pod)
  • obj: *v1.Pod 表示obj 的类型是*v1.Pod指向 v1.Pod 的指针。您的类型测试使用 v1.Pod 而不是 *v1.Pod

标签: go kubernetes google-kubernetes-engine


【解决方案1】:

我可以使用此代码读取obj 的值和内容。

func (k8s *K8S) handleAddPod(obj interface{}) {
    pod, ok := obj.(*v1.Pod)   // Added * here.  
    if ok {
        log.Debug("Status: " + string(pod.Status.Phase))
        log.Debug("Pod added: " + pod.Name + " " + pod.DeletionTimestamp.String())
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多