0

我有这个代码:

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 {

也不

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

如何正确地做到这一点?

4

2 回答 2

1

使用有效 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||&&运算符需要 type 的值bool并导致 type 的单个值bool,因此分配 toev, ok不会按您的意愿工作,也不会使用类型断言作为布尔值。如果没有类型开关,你会被困在做这样的事情:

if ev, ok := evt.(*ATypeEvent); ok {
    //process ATypeEvent
} else if ev, ok := evt.(*XTypeEvent); ok {
    //process XTypeEvent
} else if ...
于 2017-04-28T23:36:16.923 回答
1

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

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

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

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

等等。

于 2017-04-28T23:57:35.130 回答