如果您需要将数据存储在基于字典/键值的切片格式中,那么可以使用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,
    },
}
map
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},
        },
    },
}

更新1

为了能够编写data在JSON文件中,特定的data需要先转换成JSON字符串。使用json.Marshal()要从以下位置进行转换,请执行以下操作map数据(或结构对象数据)转换为JSON字符串格式(in []byte类型)。

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

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

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

如果需要将JSON数据打印为字符串,则将

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

以上语句将生成以下输出:

[{"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"}]}]