更新时间:2023-11-18 20:55:34
Filters字段没有名称,当你想初始化时,你必须重复定义:
package main
导入fmt
类型ReportDefinition结构{
过滤器[]结构{
列结构{
ColumnName字符串`json:columnName `
值字符串`json:值``
}`json:column`
运算符字符串`json:运算符``
}`json:filters `
}
func main(){
var rd ReportDefinition
rd.Filters = append(rd.Filters,struct {
Column struct {
ColumnName字符串`json:columnName`
值字符串`json:value`
}`json:column`
运算符字符串`json:运算符``
} {
列:struct {
ColumnName字符串`json:columnName`
字符串`json:值`
} {
ColumnName:foo,
值:bar,
},
操作符:==,
})
fmt.Printf(+%v \ n,rd)
}
应该清楚这是非常不方便的,所以你应该给你的类型名称(至少是你想要初始化的):
package main
导入fmt
类型ReportDefinition结构{
过滤器[] Filter`json:过滤器`
}
类型Filter结构{
列列`json:列`
操作符字符串`json:运算符`
}
$ b $ func NewFilter(col,op,val string)Filter {
return Filter {
Column:Co lumn {
ColumnName:col,
Value,val,
},
Operator:op,
}
}
类型列结构{
ColumnName字符串`json:columnName`
值字符串`json:value`
}
func main(){
var rd ReportDefinition
rd.Filters = append(rd.Filters,NewFilter(foo,==,bar))
fmt.Printf(+% v \ n,rd)
}
I have started using https://mholt.github.io/json-to-go/ to turn API JSON into go structs and I really like it, however I am stuck on how to initialize the Filters array struct in the Report Definition struct shown below.
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"`
}
I cannot seem to reference the items declared within the Filters struct or even the Filters struct in order to create a new Filter item and append it to Filters.
Is it possible to reference the Column struct with the ReportDefinition written as is? Or am I am doing something silly and I should just declare Filters outside of the ReportDefinition structure?
Since the sliced type in the Filters field doesn't have a name, you have to repeat the definition when you want to initialize it:
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)
}
It should be clear that this is very unconvenient, so you should just give your types names (at least those that you want to initialize):
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)
}