首页 > 解决方案 > Go:动态结构组合

问题描述

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

我有一个结构,它表示要序列化为 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,
        },
    }
}

有没有更好的方法来表示具有枚举类型的结构的字段?或者这是我能做到的吗?

对于如何最好地实现这一目标,我将不胜感激。

标签: gostruct

解决方案


本质上,您正在尝试在这里实现代数数据类型。要扩展 @mkopriva 的评论,请查看这篇文章:Go 和代数数据类型。本质上,您将指定一个非空接口,以便所有可能的类型都实现一个方法,而其他类型“偶然”不满足接口(而每种类型都实现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

推荐阅读