英文:
Or inside condition
问题
我有这段代码:
if ev, ok := evt.(*ATypeEvent); ok {
//处理 ATypeEvent
} else if ev, ok := evt.(*BTypeEvent); ok {
//处理 BTypeEvent
} else if ev, ok := evt.(*CTypeEvent); ok {
//处理 CTypeEvent
}
现在我有另外三种事件类型,它们都可以归类到其他三种类型之一,我认为我需要一个或运算。
但是经过多次尝试,我还没有找到正确的方法。下面的代码是不起作用的:
if ev, ok := evt.(*ATypeEvent) || evt.(*XTypeEvent); ok {
//处理 ATypeEvent 和 X
} else if ev, ok := evt.(*BTypeEvent) || evt.(*YTypeEvent); ok {
//处理 BTypeEvent 和 Y
} else if ev, ok := evt.(*CTypeEvent) || evt.(*ZTypeEvent); ok {
//处理 CTypeEvent 和 Z
}
也不是这样写:
if ev, ok := evt.(*ATypeEvent) || ev, ok := evt.(*XTypeEvent); ok {
或者这样写:
if ev, ok := (evt.(*ATypeEvent) || evt.(*XTypeEvent ) ); ok {
如何正确实现这个功能呢?
英文:
I have this code:
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
}
It so now happens that I have 3 more event types, which all fit into one of the other 3 - I'd think I need a an OR.
But after several tries, I haven't been able to figure how to do it.
This doesn't work:
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
}
nor something like
if ev, ok := evt.(*ATypeEvent) || ev, ok := evt.(*XTypeEvent); ok {
nor
if ev, ok := (evt.(*ATypeEvent) || evt.(*XTypeEvent ) ); ok {
How can this be done correctly?
答案1
得分: 1
请稍等,我会为您进行翻译。
英文:
Use a type switch as explained in Effective Go, a highly recommended resource for you to read and understand many things in 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)
}
As for why your approach didn't work, Go's ||
and &&
operators require values of type bool
and result in a single value of type bool
, so assigning to ev, ok
won't work as you wanted, nor will using a type assertion as a Boolean value. Without a type switch, you're stuck doing something like this:
if ev, ok := evt.(*ATypeEvent); ok {
//process ATypeEvent
} else if ev, ok := evt.(*XTypeEvent); ok {
//process XTypeEvent
} else if ...
答案2
得分: 1
另一种选择是在接口上定义一个处理 evt 的方法。
func (a *ATypeEvent) Process(...) ... {
//处理 ATypeEvent
}
func (x *XTypeEvent) Process(...) ... {
//处理 XTypeEvent
}
func (b *BTypeEvent) Process(...) ... {
//处理 BTypeEvent
}
以此类推。
英文:
Another option is to define a method on the interface for evt.
func (a *ATypeEvent) Process(...) ... {
//process ATypeEvent
}
func (x *XTypeEvent) Process(...) ... {
//process XTypeEvent
}
func (b *BTypeEvent) Process(...) ... {
//process BTypeEvent
}
and so on.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论