或内部条件
Or inside condition
我有这个代码:
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 {
如何才能正确做到这一点?
使用类型开关,如 Effective 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's ||
and &&
operators require values of type bool
and result in a single value of type 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
}
等等。
我有这个代码:
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 {
如何才能正确做到这一点?
使用类型开关,如 Effective 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's ||
and &&
operators require values of type bool
and result in a single value of type 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
}
等等。