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
}
等等