go - 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,
},
}
}
有没有更好的方法来表示具有枚举类型的结构的字段?或者这是我能做到的吗?
对于如何最好地实现这一目标,我将不胜感激。
解决方案
本质上,您正在尝试在这里实现代数数据类型。要扩展 @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
推荐阅读
- sql - SQL Server 2016 服务器事件通知不起作用
- oracle - 限制用户可以使用 oracle 报告生成多少表单/报告
- java - 找到未修补的 iText,无法使用字形渲染
- javascript - 如何在 Safari 和 Epiphany 中允许 inline-javascript?
- javascript - 如何在 Raspberry PI 上流畅运行 HTML、CSS 和 JS 视频
- vaadin - Vaadin Web 应用程序中的分离事件没有被调用
- dart - 颤振“严格”模式?
- javascript - 如何在 JavaScript 中直接实例化 WebAssembly 模块
- php - 启用阿拉伯文和英文字母(正则表达式 - PHP)
- azure - 获取 VSTS 发布管道中使用的任务组版本