【发布时间】: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