【问题标题】:golang , How to count elements in struct type interface{}?golang,如何计算结构类型 interface{} 中的元素?
【发布时间】:2016-05-19 09:38:16
【问题描述】:

我是 Go 的新手,但很努力..

我正在尝试编写一些逻辑,需要检查 struct 的属性是否仅包含一个元素,或者第一个元素是否只有一个子元素。

主要结构是这样的:

type ChartOptins struct {
    Filters Filter `json:"filters"`
    Charts interface{} `json:"charts"`
}

图表天生就是这样的结构数组的组合:

    $filters = array(
        "filters" => array(
            "DayStart" => "12-01-2015",
            "DayEnd" => "12-05-2015",
            "TimePeriods"=> array(
                array("qqq","www"),
            ),
            "lines" => array(
                "first","avokado","drunduki"
            )

        ),
        "charts" => array(
            "noagg" => array(
                array(
                    "name" => "HOLD",
                    "type" => "line"
                ),
                array(
                    "name" => "UKKR",
                    "type" => "line"
                ),
                array(
                    "name" => "SVO",
                    "type" => "line"
                ),
            ),
            "oracle" => array(
                array(
                    "name" => "TDD",
                    "type" => "line"
                ),
            ) 
        ),
    );

进入 stuct ChartOptions 我从 POST 请求中解析 JSON。 JSON 看起来像这样:

{ "filters": { "dayStart": "11-10-2015", "dayEnd": "21-10-2015", "timePeriods": [ [ "qqq", "www" ] ], "lines": [ "first", "avokado", "drunduki" ] }, "charts": { "noagg": [ { "name": "HOLD", "type": "line" } ] } }

所以,charts 只能有 1 个源和 1 个元素,或者任何数量的源中的任何数量的元素。

"charts" : { "noagg": [ { "name": "HOLD", "type": "line" } ] }
or
"charts" : { "noagg": [ { "name": "HOLD", "type": "line" } , { "name": "TDD", "type": "line" } , { "name": "SVO", "type": "line" } ] }

当然,这是 Go 脚本中的 JSON 元素,我将它们解析为 interface{}。当我尝试使用len()时,Go说我不能在界面上使用它..

处理元素数量的最佳做法是什么?实现此类检查的最佳方法是什么?

【问题讨论】:

  • 尝试使用reflect
  • 你能举几个例子吗?
  • 不要解析成 ìnterface{}(如果是 Go 新手,则不应使用它),而是解析成带有 noagg 切片的适当结构,并在该切片上执行 len
  • 我也会尝试为此使用切片,但为此必须将每个切片的结构类型声明到树的底部...

标签: go struct slice


【解决方案1】:

这里是一个示例保存界面: https://play.golang.org/p/Eu6Hj6ddSE

只需更改: Charts interface{}女巫Charts []interface{} 如果 v 是您 ChartOptins 那么让您的 len 在界面上使用 .() 运算符

fmt.Println(len(v.Charts.([]interface{})))

【讨论】:

    【解决方案2】:

    据我了解,您只需要定义结构来正确映射 json。可以是这样的:

    package main
    
    import (
        "encoding/json"
        "fmt"
        "strings"
    )
    
    type ChartOptins struct {
        Filters map[string]interface{} `json:"filters"`
        Charts  map[string][]Chart     `json:"charts"`
    }
    
    type Chart struct {
        Name string `json:"name"`
        Type string `json:"type"`
    }
    
    func main() {
        const jsonStream = `{
            "filters": { "dayStart": "oneortwo", "dayEnd": "oneorthree", "timePeriods": [ [ "qqq", "www" ] ], "lines": [ "first", "avokado", "drunduki" ] }, 
            "charts": { "noagg": [ { "name": "HOLD", "type": "line" }, { "name": "UKKR", "type": "line" }, { "name": "SVO", "type": "line" } ], "oracle": [ { "name": "TDD", "type": "line" } ] } 
        }`
    
        var co ChartOptins
        json.NewDecoder(strings.NewReader(jsonStream)).Decode(&co)
    
        fmt.Println(co)
    
        for k, v := range co.Charts {
            fmt.Printf("key: %v\n", k)
            for _, ch := range v {
                fmt.Printf("Name: %v, type: %v\n", ch.Name, ch.Type)
            }
        }
    }
    

    【讨论】:

    • 我需要源名称是动态的,这就是我使用接口的原因。我发现可以使用map[string]Charts,但现在我得到错误,该数组无法解析到我的新结构中。“源”的名称可以是x,y,...,n,并且可能有多个源一瞬间..
    • 你能在附加的 json 字段中发送动态对象名称吗?你知道这个对象的结构吗?
    • 我知道结构。但我不能发送额外的“名称”属性。我将编写有问题的主数组的结构。更新了问题正文
    • 所以你不知道带有聊天数组的对象的名称,对吧? (例如“noagg”)
    • 可以是列表之一,但列表是动态的。我的意思是现在只有 3 个源元素。但稍后可能会有 10 个或更多的数据源用于图表
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多