Go中嵌套的数组结构 [英] Nested structs of arrays in Go

查看:111
本文介绍了Go中嵌套的数组结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开始使用 https://mholt.github.io/json-to- go / 将API JSON转换为结构体,我非常喜欢它,但是我一直在如何初始化下面显示的报告定义结构中的Filters数组struct。



pre $ $ Report $ $ $ $ $ ReportType字符串json:reportType
产品字符串` json:product`
电子邮件字符串`json:email`
CreatedBy字符串`json:createdBy`
持续时间struct {
持续时间字符串`json: `
StartDate接口{}`json:startDate`
EndDate接口{}`json:endDate`
}`json:duration`
过滤器[ ] struct {
列结构{
ColumnName字符串`json:columnName`
值字符串`json:value`
}`json:column`
json:filters`
SortBy接口{}`json:sortBy`
ReportGroup接口{}`json:reportGroup `
ReportOnHierarchy bool`json:reportOnHierarchy
IsReportPreview字符串`json:isReportPreview``
OutputRecordCount接口{}`json:outputRecordCount`
Schedule interface {} `json:schedule`
Columns [] interface {}`json:columns`
}

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



是否可以使用ReportDefinition按照原样引用Column结构?或者我正在做一些愚蠢的事情,我应该在ReportDefinition结构之外声明过滤器?

解决方案

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

这篇关于Go中嵌套的数组结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆