Go:动态结构组合

Go:动态结构组合,go,struct,Go,Struct,我希望了解哪种方法最适合解决以下问题 我有一个结构,它表示作为JSON响应的一部分序列化的数据。此结构config上的属性可以是三种可能的结构之一,但是,我知道表示此属性的唯一方法是使用类型接口{},并让调用方类型断言该属性 类型响应结构{ Field1字符串`json:“Field1”` Field2 int`json:“Field2”` 配置接口{}`json:“Config”` } 输入ConfigOne结构{ SomeField字符串 } 类型ConfigTwo struct{ Some

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

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

类型响应结构{
Field1字符串`json:“Field1”`
Field2 int`json:“Field2”`
配置接口{}`json:“Config”`
}
输入ConfigOne结构{
SomeField字符串
}
类型ConfigTwo struct{
SomeField int
}
类型ConfigThree struct{
萨默菲尔德布尔酒店
}
然后我可以使用
新的
样式函数为我创建正确的实例:

func NewConfigTwo()*响应{
回报与回应{
字段1:“你好”,
字段2:1,
Config:ConfigTwo{
SomeField:22,
},
}
}
有没有更好的方法用类似枚举的结构类型表示字段?或者这是我能做的最好的吗


如果您能就如何最好地实现这一点提供任何澄清或建议,我将不胜感激。

本质上,您正在尝试在这里实现代数数据类型。要扩展@mkopriva的评论,请查看以下帖子:。本质上,您将指定一个非空接口,以便所有可能的类型实现一个方法,而其他类型“偶然”不满足该接口(而每个类型实现
接口{}
),然后使用类型开关

类似于(未经测试):


就将响应序列化为JSON而言,这是最好的。如果要对字段强制执行类似“枚举”的限制,可以声明一个非空接口,然后让枚举的成员实现它,这样,不实现该接口的类型的值就不能分配给该字段。@mkopriva-hmm有趣的是,我将尝试一下,谢谢。如果您感兴趣,您可以看到这种方法甚至在std库中也被使用。例如,@mkopriva这实际上非常有用,再次感谢。@Adrian:是的,从这个意义上说,我不认为我的版本与原始版本不同
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