go - Go中数组的嵌套结构

标签 go

我已经开始使用 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"`
}

我似乎无法引用在 Filters 结构甚至 Filters 结构中声明的项来创建新的 Filter 项并将其附加到 Filters。

是否可以按原样引用带有 ReportDefinition 的 Column 结构?还是我在做一些愚蠢的事情,我应该只在 ReportDefinition 结构之外声明过滤器?

最佳答案

由于Filters字段中的sliced type没有名字,所以初始化的时候需要重复定义:

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

关于go - Go中数组的嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49479464/

相关文章:

interface - 在 Go 的接口(interface)中列出接口(interface)

gob.Register() 按类型还是按每个变量?

go - 评估/执行Golang代码/表达式,例如js的eval()

Go dep 不解析 "golang.org/x/crypto"

使用 select 时转到 channel 丢失偶数

go - go中的相等运算符和deepEquals有什么区别?

file - 递归地在目录中查找文件

go - 如何将 *_Ctype_char 转换为 *_Ctype_uchar

go - 确保 net/http 客户端通过 TLS 1.2 连接的传输选项

mysql - Go 和 mysql,不会拉取所有列