dtbl1231 2018-07-24 21:22
浏览 11
已采纳

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

I understand that Go does not support enums of the kind shown in the Rust example below. What would be the idiomatic way of achieving the same effect, i.e., perform matching on types, in Go? For example, would I use an empty struct or an interface?

enum WebEvent {
    PageLoad,
    KeyPress(char),
}

fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad => println!("page loaded"),
        WebEvent::KeyPress(c) => println!("pressed '{}'.", c),
    }
}

Example taken from Rust By Example.

  • 写回答

1条回答 默认 最新

  • duadlkc5762218 2018-07-24 21:43
    关注

    If your WebEvents share a common functionality, define an explicit interface.

    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)!
        }
    }
    

    Otherwise you can use an empty interface

    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{}
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败