Go中实现Rust式类型匹配的惯用方式是什么?

时间:2018-07-24 21:22:51

标签: go

我知道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的示例。

1 个答案:

答案 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{}
    }
}