我已经开始使用https://mholt.github.io/json-to-go/将 API JSON 转换为 go 结构,我真的很喜欢它,但是我坚持如何在报告定义结构中初始化过滤器数组结构如下所示。
type ReportDefinition struct {
ReportName string `json:"reportName"`
ReportType string `json:"reportType"`
Product string `json:"product"`
Email string `json:"email"`
CreatedBy string `json:"createdBy"`
Duration struct {
Duration string `json:"duration"`
StartDate interface{} `json:"startDate"`
EndDate interface{} `json:"endDate"`
} `json:"duration"`
Filters []struct {
Column struct {
ColumnName string `json:"columnName"`
Value string `json:"value"`
} `json:"column"`
Operator string `json:"operator"`
} `json:"filters"`
SortBy interface{} `json:"sortBy"`
ReportGroup interface{} `json:"reportGroup"`
ReportOnHierarchy bool `json:"reportOnHierarchy"`
IsReportPreview string `json:"isReportPreview"`
OutputRecordCount interface{} `json:"outputRecordCount"`
Schedule interface{} `json:"schedule"`
Columns []interface{} `json:"columns"`
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法引用在过滤器结构甚至过滤器结构中声明的项目来创建新的过滤器项目并将其附加到过滤器。
是否可以使用按原样编写的 ReportDefinition 引用 Column 结构?还是我在做一些愚蠢的事情,我应该在 ReportDefinition 结构之外声明过滤器?
由于 Filters 字段中的切片类型没有名称,因此您要初始化它时必须重复定义:
package main
import "fmt"
type ReportDefinition struct {
Filters []struct {
Column struct {
ColumnName string `json:"columnName"`
Value string `json:"value"`
} `json:"column"`
Operator string `json:"operator"`
} `json:"filters"`
}
func main() {
var rd ReportDefinition
rd.Filters = append(rd.Filters, struct {
Column struct {
ColumnName string `json:"columnName"`
Value string `json:"value"`
} `json:"column"`
Operator string `json:"operator"`
}{
Column: struct {
ColumnName string `json:"columnName"`
Value string `json:"value"`
}{
ColumnName: "foo",
Value: "bar",
},
Operator: "==",
})
fmt.Printf("+%v\n", rd)
}
Run Code Online (Sandbox Code Playgroud)
很明显,这是非常不方便的,所以你应该只给出你的类型名称(至少是那些你想要初始化的名称):
package main
import "fmt"
type ReportDefinition struct {
Filters []Filter `json:"filters"`
}
type Filter struct {
Column Column `json:"column"`
Operator string `json:"operator"`
}
func NewFilter(col, op, val string) Filter {
return Filter{
Column: Column{
ColumnName: col,
Value: val,
},
Operator: op,
}
}
type Column struct {
ColumnName string `json:"columnName"`
Value string `json:"value"`
}
func main() {
var rd ReportDefinition
rd.Filters = append(rd.Filters, NewFilter("foo", "==", "bar"))
fmt.Printf("+%v\n", rd)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4951 次 |
| 最近记录: |