在Go中实现类锈类型匹配的惯用方法是什么?

在Go中实现类锈类型匹配的惯用方法是什么?,go,Go,我知道Go不支持下面的例子中所示的枚举。在Go中,实现相同效果的惯用方法是什么,即对类型执行匹配?例如,我是使用空结构还是使用接口 枚举WebEvent{ 页面加载, 按键(字符), } fn检查(事件:WebEvent){ 比赛项目{ WebEvent::PageLoad=>println!(“已加载页面”), WebEvent::KeyPress(c)=>println!(“按下“{}.”,c), } } 示例取自。如果您的WebEvents共享一个公共功能,请定义一个显式接口 type

我知道Go不支持下面的例子中所示的枚举。在Go中,实现相同效果的惯用方法是什么,即对类型执行匹配?例如,我是使用空结构还是使用接口

枚举WebEvent{ 页面加载, 按键(字符), } fn检查(事件:WebEvent){ 比赛项目{ WebEvent::PageLoad=>println!(“已加载页面”), WebEvent::KeyPress(c)=>println!(“按下“{}.”,c), } }
示例取自。

如果您的WebEvents共享一个公共功能,请定义一个显式接口

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

如果这个问题是针对Go用户的,那么您必须解释代码的作用,最好先展示您自己的尝试。另外,可能还有一个有用的注意事项:Rust枚举实际上是求和类型,而不是C样式的枚举。建议的复制目标似乎无法解决这一问题。我知道如何使用Go枚举,但我认为这不是解决方法。我对匹配不同的类型感兴趣,因为我是新手,所以我不确定我是否会使用空结构作为父结构或接口或其他东西entirely@SavvasSavvides如果它们都有共同的方法子集,则使用显式接口。否则,请使用空接口。无论哪种方式:类型开关是你的朋友。