我已经开始使用https://mholt.github.io/json-to-go/将API JSON转换为go结构,但我真的很喜欢它,但是我仍然坚持如何在Report Definition结构中初始化Filters数组结构如下所示。
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"` }
我似乎无法引用在Filters结构甚至是Filters结构中声明的项,以创建新的Filter项目并将其附加到Filters。
是否可以使用原样编写的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) }
应当清楚的是,这非常不方便,因此您应该给类型名称(至少要初始化的名称):
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) }