我是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}
]}
]
[更新]:
Go语言中的.append()
Python等价物是什么?
list_ = []
dict_ = {"key": val}
list_.append(dict_)
我通过借用this answer找到了本节([更新])的答案:
type Dictionary map[string]interface{}
data := []Dictionary{}
dict1 := Dictionary{"key": 1}
dict2 := Dictionary{"key": 2}
data = append(data, dict1, dict2)
答案 0 :(得分: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,
},
}
但是我建议,如果您的数据结构是固定的,那么请定义一个结构。下面是另一个使用相同数据集但在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},
},
},
}
要能够将data
写入json文件,必须先将data
转换为json字符串。使用json.Marshal()
进行map
类型的从[]byte
数据(或结构对象数据)到json字符串的转换。
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字符串,请先将buf
强制转换为string
类型。
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"}]}]
答案 1 :(得分:2)
所以您要寻找的类型是:
dict => map
list => slice
一个简单的地图示例如下:
m:=map[string]int{
"a": 1,
"b": 2,
}
切片的一个简单示例如下:
var s []int
s = append(s, 1)
s = append(s, 2, 3)
因此,请根据您的类型进行合并:
[]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"},
},
},
}