我希望了解哪种方法最适合解决以下问题。
我有一个结构,表示要序列化的数据作为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,
},
}
}
有没有更好的方法来用枚举表示结构类型的字段?还是我能做到的那么好?
对于可以最好地实现这一目标的任何澄清或建议,我将不胜感激。
答案 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