或内部状况



我有此代码:

if ev, ok := evt.(*ATypeEvent); ok {
   //process ATypeEvent
} else if ev, ok := evt.(*BTypeEvent); ok {
   //process BTypeEvent
} else if ev, ok := evt.(*CTypeEvent); ok {
   //process CTypeEvent
}

现在碰巧我还有3种事件类型,它们都适合另一种3-我想我需要一个或。

但是经过几次尝试,我无法弄清楚如何做。这行不通:

if ev, ok := evt.(*ATypeEvent) || evt.(*XTypeEvent); ok {
   //process ATypeEvent and X
} else if ev, ok := evt.(*BTypeEvent)  || evt.(*YTypeEvent); ok {
   //process BTypeEvent and Y
} else if ev, ok := evt.(*CTypeEvent)  || evt.(*ZTypeEvent); ok {
   //process CTypeEvent and Z
}

也不像

if ev, ok := evt.(*ATypeEvent) || ev, ok := evt.(*XTypeEvent); ok {

nor

if ev, ok := (evt.(*ATypeEvent) || evt.(*XTypeEvent ) ); ok {

如何正确完成?

使用有效GO中解释的类型开关,这是一个强烈推荐的资源,供您阅读和理解GO中的许多内容:

switch v := ev.(type) {
case *ATypeEvent, *XTypeEvent:
    // process ATypeEvent and X
case *BTypeEvent, *YTypeEvent:
    // process BTypeEvent and Y
case *CTypeEvent, *ZTypeEvent:
    // process CTypeEvent and Z
default:
    // should never happen
    log.Fatalf("error: unexpected type %T", v)
}

至于为什么您的方法不起作用,GO的||&&运算符需要类型bool的值,并导致单个类型bool的值,因此分配给ev, ok无法按照您的意愿工作,也不会使用类型断言是布尔值。没有类型的开关,您就会卡住这样的操作:

if ev, ok := evt.(*ATypeEvent); ok {
    //process ATypeEvent
} else if ev, ok := evt.(*XTypeEvent); ok {
    //process XTypeEvent
} else if ...

另一个选项是在EVT的接口上定义一种方法。

func (a *ATypeEvent) Process(...) ... {
  //process ATypeEvent
}
func (x *XTypeEvent) Process(...) ... {
  //process XTypeEvent
}
func (b *BTypeEvent) Process(...) ... {
  //process BTypeEvent
}

等等。

相关内容

  • 没有找到相关文章

最新更新