我知道Go不支持下面Rust示例中所示的那种枚举。在Go中达到相同效果(即对类型进行匹配)的惯用方式是什么?例如,我会使用空的结构还是接口?
enum WebEvent {
PageLoad,
KeyPress(char),
}
fn inspect(event: WebEvent) {
match event {
WebEvent::PageLoad => println!("page loaded"),
WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
}
}
摘自Rust By Example的示例。
答案 0 :(得分:2)
如果您的WebEvent具有相同的功能,请定义一个显式接口。
type WebEvent interface {
Foo()
Bar()
}
type PageLoad struct{}
func (*pl PageLoad) Foo() {
// do something
}
func (*pl PageLoad) Bar() {
// do something else
}
func Inspect(event WebEvent) {
switch event.(type) {
case PageLoad:
// inside this block you're operating on event.(PageLoad), not just event.(WebEvent)!
}
}
否则,您可以使用一个空界面
type PageLoad struct{} // optionally with methods as above
func Inspect(event interface{}) {
switch event.(type) {
case PageLoad:
// similarly, in here event is a PageLoad, not an interface{}
}
}