转到:动态结构组成

时间:2019-05-03 09:11:24

标签: go struct

我希望了解哪种方法最适合解决以下问题。

我有一个结构,表示要序列化的数据作为JSON响应的一部分。该结构config上的属性可以是三种可能的结构之一,但是,我知道表示此属性的唯一方法是使用类型interface{}并让调用者类型断言该属性。

type Response struct {
    Field1 string      `json:"field1"`
    Field2 int         `json:"field2"`
    Config interface{} `json:"config"`
}

type ConfigOne struct {
    SomeField string
}

type ConfigTwo struct {
    SomeField int
}

type ConfigThree struct {
    SomeField bool
}

然后我可以使用New样式函数为我创建合适的实例:

func NewConfigTwo() *Response {
    return &Response{
        Field1: "hello",
        Field2: 1,
        Config: ConfigTwo{
            SomeField: 22,
        },
    }
}

有没有更好的方法来用枚举表示结构类型的字段?还是我能做到的那么好?

对于可以最好地实现这一目标的任何澄清或建议,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

本质上,您正在尝试在此处实现代数数据类型。要扩展@mkopriva的评论,请看一下这篇文章:Go and algebraic data types。本质上,您将指定一个非空接口,以便所有可能的类型都实现一个方法,而其他类型都不满足“偶然”的接口(而每个类型都实现interface{}),然后使用类型开关。

(未经测试)之类的东西

type Response struct {
    Field1 string      `json:"field1"`
    Field2 int         `json:"field2"`
    Config Configable  `json:"config"`
}

type Configable interface {
    isConfig()
}

type ConfigOne struct {
    SomeField string
}

func (ConfigOne) isConfig() {}

// ... and so on for other Config* types