Как создать список словарей на Голанге? - PullRequest
0 голосов
/ 19 декабря 2018

Я новичок в 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}
 ]}
]

[ОБНОВЛЕНИЕ]:

Что такое .append() Python-эквивалент в языке Go что-то подобное?

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

Я нашел ответ на этот раздел ([ОБНОВЛЕНИЕ]), позаимствовав этот ответ :

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

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Итак, типы, которые вы ищете:

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"},
        },
    },
}
0 голосов
/ 19 декабря 2018

Если вам нужно, чтобы данные сохранялись в словаре, достаточно использовать комбинацию среза и 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},
        },
    },
}

Обновление 1

Чтобы иметь возможность записать data в файл json, 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)
}

Затем введите 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"}]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...