dpkpaxhzffixp8426 2018-12-19 07:20
浏览 350
已采纳

如何在Golang中创建词典列表?

I'm newbie with Golang.

I want to create a list of dictionaries with resizable capability (this is not static) with append some dict to the list, finally write it on a file, but I confused.

I want something like that:

[
 {"port": 161, "timeout": 1, "sleep_time": 5, "metrics": [
  {"tag_name": "output_current", "id": 3},
  {"tag_name": "input_voltage", "id": 2}
 ]},
 {"port": 161, "timeout": 1, "sleep_time": 4, "metrics": [
   {"tag_name": "destructor", "id": 10}
 ]}
]

[UPDATE]:

What is the .append() Python equivalent in Go language something like that?

list_ = []
dict_ = {"key": val}
list_.append(dict_)

I found the answer to this section ([UPDATE]) by borrowing this answer:

type Dictionary map[string]interface{}
data := []Dictionary{}
dict1 := Dictionary{"key": 1}
dict2 := Dictionary{"key": 2}
data = append(data, dict1, dict2)
  • 写回答

2条回答 默认 最新

  • douchengchu8374 2018-12-19 07:28
    关注

    If you need the data to be stored in a dictionary, using a combination of slice and map[string]interface{} is enough.

    In this example below, I created a new type called Dictionary, to avoid writing too many map[string]interface{} syntax on composite literals.

    type Dictionary map[string]interface{}
    
    data := []Dictionary{
        {
            "metrics": []Dictionary{
                { "tag_name": "output_current", "id": 3 },
                { "tag_name": "input_voltage", "id": 2 },
            },
            "port":       161,
            "timeout":    1,
            "sleep_time": 5,
        },
        {
            "metrics": []Dictionary{
                { "tag_name": "destructor", "id": 10 },
            },
            "port":       161,
            "timeout":    1,
            "sleep_time": 4,
        },
    }
    

    But I suggest, if your data structure is fixed, then define a struct instead. Below is an another example using same dataset but in struct object:

    type Metric struct {
        TagName string `json:"tag_name"`
        ID      int    `json:"id"`
    }
    
    type Data struct {
        Port      int      `json:"port"`
        Timeout   int      `json:"timeout"`
        SleepTime int      `json:"sleep_time"`
        Metrics   []Metric `json:"metrics"`
    }
    
    data := []Data{
        Data{
            Port:      161,
            Timeout:   1,
            SleepTime: 5,
            Metrics: []Metric{
                Metric{TagName: "output_current", ID: 3},
                Metric{TagName: "input_voltage", ID: 2},
            },
        },
        Data{
            Port:      161,
            Timeout:   1,
            SleepTime: 4,
            Metrics: []Metric{
                Metric{TagName: "destructor", ID: 10},
            },
        },
    }
    

    Update 1

    To be able to write the data in json file, the data need to be converted into json string first. Use json.Marshal() to do the conversion from map data (or struct object data) to json string, in []byte type.

    buf, err := json.Marshal(data)
    if err !=nil {
        panic(err)
    }
    
    err = ioutil.WriteFile("fileame.json", buf, 0644)
    if err !=nil {
        panic(err)
    }
    

    Then use ioutil.WriteFile() to write it into file.


    If you somehow need to print the json string, cast the buf into string type first.

    jsonString := string(buf)
    fmt.Println(jsonString)
    

    Statements above will generate output below:

    [{"port":161,"timeout":1,"sleep_time":5,"metrics":[{"tag_name":"output_current","id":"3"},{"tag_name":"input_voltage","id":"2"}]},{"port":161,"timeout":1,"sleep_time":4,"metrics":[{"tag_name":"destructor","id":"10"}]}]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • duanmu0834 2018-12-19 07:33
    关注

    So the types you are looking for are:

    dict => map
    list => slice
    

    A simple example of a map looks like:

    m:=map[string]int{
      "a": 1,
      "b": 2,
    }
    

    A simple example of a slice looks like:

    var s []int
    s = append(s, 1)
    s = append(s, 2, 3)
    

    So to put that together for your type:

    []map[string]interface{}{
        {
            "port":       161,
            "timeout":    1,
            "sleep_time": 5,
            "metrics": []map[string]interface{}{
                {"tag_name": "output_current", "id": "3"},
                {"tag_name": "input_voltage", "id": "2"},
            },
        },
        {
            "port":       161,
            "timeout":    1,
            "sleep_time": 4,
            "metrics": []map[string]interface{}{
                {"tag_name": "destructor", "id": "10"},
            },
        },
    }
    
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 AXI VIP验证多余打印问题
  • ¥15 利用加权最小二乘法求某品牌手机价格指标,已按照总销量计算出权重,各类型号手机价格已知,如何求得价格指标?
  • ¥15 如何自制一个硬件钱包,有兴趣的朋友一起交流
  • ¥15 (关键词-聊天软件)
  • ¥15 求大家看看这个编程的编法没有思路啊
  • ¥20 WSL打开图形化程序子窗口无法点击
  • ¥15 Jupyter Notebook 数学公式不渲染
  • ¥20 ERR_CACHE_MISS 确认重新提交表单
  • ¥20 关于vba使用HTMLfile执行js函数问题
  • ¥60 悬赏求解,通过实时现场摄像头的视频图像识别其他对家打出的麻将牌,识别麻将牌,识别牌墙位置,通过识别对家打出了什么牌