Golang: карта с несколькими значениями для каждого ключа


 func ParseportsFromFile(file string) (map[string]string, error) {
            buf, err := ioutil.ReadFile(file)
            if err != nil {
                return nil, err
            }
            ret := [make(map[string]string)]
            rows := strings.Split(string(buf), "\n")
            for _, row := range rows {
                kvs := strings.SplitN(row, " = ", 2)
                if len(kvs) == 2 {
                    ret[strings.TrimSpace(kvs[0])] = strings.TrimSpace(kvs[1])
                }
            }
            return ret, nil
        }

Эта функция позволяет мне читать такой файл:

user1=123 
user1=321 
user2=124 

Однако возврат данных

map[user1:321 user2:124]

Таким образом, это значит, что user1=123 был перезаписан пользователем1=321. Как этого избежать? Как создать массив, например карта[пользователь1:[123,321], пользователь2: 124] чтобы избежать перезаписи элемента другим?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
3
0
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так как go строго типизирован, было бы проще сделать из него сразу карту срезов. См., например, тип http.Заголовок. У них была та же проблема, которую нужно было решить при ее разработке.

В вашем случае это может выглядеть примерно так:

result := make(map[string][]string)

for _, row := range rows {
    parts := strings.Split(row, " = ")
    key := parts[0]
    value := parts[1]
    result[key] = append(result[key], value)
}

https://go.dev/play/p/5uRH-aQmATR

В противном случае вам нужно использовать interface{} (любой), чтобы вы могли иметь оба, string и []string, но логика для этого будет более сложной, и ее использование также будет более сложным, поскольку вам всегда нужно проверять, что это такое и делать утверждение типа и так далее. Ведь я бы не советовал.

Другие вопросы по теме