【问题标题】:How to define dynamic interface/struct如何定义动态接口/结构
【发布时间】:2019-04-20 00:08:45
【问题描述】:

我对 Go 还是很陌生,真的在寻找一些指导。

在我的应用程序中,我有一个接收事件的通道,我希望有一个类似的接口:

{
  "type": "event1",
  "data": {}
}

data 的结构依赖于type

然后,在通道中侦听这些事件的代码将根据事件的类型知道期望什么样的结构。

如何定义这样的接口? 这在 Go 中被认为是一种好的做法吗?

提前致谢

【问题讨论】:

    标签: go struct interface channel


    【解决方案1】:

    您正在寻找type switch:

    package main
    
    import (
        "fmt"
    )
    
    type X struct {
        i int
    }
    
    func main() {
        c := make(chan interface{}, 5)
        c <- 4
        c <- "hi"
        c <- X{}
        close(c)
    
        for value := range c {
            switch v := value.(type) {
            case int:
                fmt.Println("got int", v)
            case string:
                fmt.Println("got string", v)
            case X:
                fmt.Println("got X", v)
            default:
                fmt.Printf("unexpected type %T\n", value)
            }
        }
    }
    

    【讨论】:

    • 或者只是一个普通的switch,因为他们已经有一个提供类型指示符的string 字段。
    • 确实如此,如果event总是对应数据的类型,那将是一个更简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多