If statement 还是内部条件

If statement 还是内部条件,if-statement,go,logical-or,If Statement,Go,Logical Or,我有以下代码: 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种类型中的一种-我想我需要一个OR 但经

我有以下代码:

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种类型中的一种-我想我需要一个OR

但经过几次尝试后,我一直不知道该怎么做。 这不起作用:

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 {
也不是


如何正确执行此操作?

如中所述使用类型开关,这是一个强烈建议您阅读和理解围棋中许多内容的资源:

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)
}
至于您的方法不起作用的原因,那么分配给
ev,ok
将不会像您希望的那样起作用,也不会使用类型断言作为布尔值。如果没有类型开关,您将无法执行以下操作:

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

使用类型开关,如中所述,强烈建议您阅读和理解围棋中的许多内容:

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)
}
至于您的方法不起作用的原因,那么分配给
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
}

依此类推。

另一个选项是在evt接口上定义一个方法

func (a *ATypeEvent) Process(...) ... {
  //process ATypeEvent
}

func (x *XTypeEvent) Process(...) ... {
  //process XTypeEvent
}

func (b *BTypeEvent) Process(...) ... {
  //process BTypeEvent
}
等等