dongwo2772 2018-03-25 18:37
浏览 527
已采纳

Go中的嵌套数组结构

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?

  • 写回答

1条回答 默认 最新

  • dshmvqnl98119 2018-03-26 07:58
    关注

    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
    ", 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
    ", rd)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改
  • ¥15 Windows 系统cmd后提示“加载用户设置时遇到错误”
  • ¥50 vue router 动态路由问题
  • ¥15 关于#.net#的问题:End Function
  • ¥15 无法import pycausal
  • ¥15 VS2022创建MVC framework提示:预安装的程序包具有对缺少的注册表值的引用
  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用