Go中的嵌套数组结构体

6

我开始使用https://mholt.github.io/json-to-go/将API JSON转换为go结构体,并且我非常喜欢它,但是我不知道如何初始化报告定义结构中的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?


3
应该将匿名结构体定义为ReportDefinition之外的独立类型。 - Andy Schweig
1
正如Andy Schweig所说,您应该像这样定义您的类型:https://play.golang.org/p/RKOnM6QcaS5。在您的版本中,您无法引用“Column”结构,因为它是匿名的,您有一个Column字段,其类型是匿名结构,您的代码中没有Column类型。 - mkopriva
1个回答

5

由于Filters字段中的sliced类型没有名称,因此在初始化时需要重复定义:

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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接