为了账号安全,请及时绑定邮箱和手机立即绑定

golang ,如何计算结构类型 interface{} 中的元素?

golang ,如何计算结构类型 interface{} 中的元素?

Go
翻阅古今 2021-12-07 19:38:27
我是 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"                ),            )         ),    );进入结构,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" } ] }当然,这是转到脚本的 JSON 元素,我将它们解析为 interface{}。当我尝试使用时len(),Go 说我不能在界面上使用它..处理元素数量的最佳实践是什么,实现这种检查的最佳方法是什么?
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

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


只要改变: Charts interface{}女巫Charts []interface{} 。接口上,如果v是你ChartOptins然后让你用LEN()运算符


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


查看完整回答
反对 回复 2021-12-07
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

据我了解,您只需要定义用于正确映射 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)

        }

    }

}


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信