如何定义动态接口/结构

时间:2018-11-16 19:11:24

标签: go struct interface channel

我刚接触Go,真的在寻找一些指导。

在我的应用程序中,我有一个接收事件的通道,我想有一个像这样的接口:

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

data的结构取决于type

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

如何定义此类接口? 这在Go中被认为是一种好习惯吗?

预先感谢

1 个答案:

答案 0 :(得分:3)

您正在寻找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)
        }
    }
}