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

Ben*_*ari 2 json dictionary list go

我是Golang的新手。

我想创建一个具有可调整大小功能的字典列表(这不是静态的),并将一些字典追加到列表中,最后将其写入文件中,但是我感到困惑。

我想要这样的东西:

[
 {"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}
 ]}
]
Run Code Online (Sandbox Code Playgroud)

[更新]:

.append()Go语言中的Python等价于什么?

list_ = []
dict_ = {"key": val}
list_.append(dict_)
Run Code Online (Sandbox Code Playgroud)

我通过借用以下答案找到了本节的答案([更新]):

type Dictionary map[string]interface{}
data := []Dictionary{}
dict1 := Dictionary{"key": 1}
dict2 := Dictionary{"key": 2}
data = append(data, dict1, dict2)
Run Code Online (Sandbox Code Playgroud)

nov*_*ung 6

如果您需要将数据存储在字典中,则使用slice和的组合map[string]interface{}就足够了。

在下面的示例中,我创建了一个名为的新类型Dictionary,以避免map[string]interface{}在复合文字上编写太多语法。

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,
    },
}
Run Code Online (Sandbox Code Playgroud)

但是我建议,如果您的数据结构是固定的,那么请定义一个结构。下面是另一个使用相同数据集但在struct对象中的示例:

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},
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

更新1

为了能够写入datajson文件,首先data需要将其转换为json字符串。用于json.Marshal()将类型中的map数据(或结构对象数据)转换为json字符串[]byte

buf, err := json.Marshal(data)
if err !=nil {
    panic(err)
}

err = ioutil.WriteFile("fileame.json", buf, 0644)
if err !=nil {
    panic(err)
}
Run Code Online (Sandbox Code Playgroud)

然后使用ioutil.WriteFile()将其写入文件。


如果您需要以某种方式打印json字符串,请先将in buf转换为stringtype。

jsonString := string(buf)
fmt.Println(jsonString)
Run Code Online (Sandbox Code Playgroud)

上面的语句将在下面生成输出:

[{"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"}]}]
Run Code Online (Sandbox Code Playgroud)


poy*_*poy 5

所以你要找的类型是:

dict => map
list => slice
Run Code Online (Sandbox Code Playgroud)

一个简单的地图示例如下所示:

m:=map[string]int{
  "a": 1,
  "b": 2,
}
Run Code Online (Sandbox Code Playgroud)

切片的简单示例如下所示:

var s []int
s = append(s, 1)
s = append(s, 2, 3)
Run Code Online (Sandbox Code Playgroud)

所以为了你的类型把它放在一起:

[]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"},
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

  • 空接口可以(例如,`interface{}`)。看看https://tour.golang.org/methods/14 (2认同)