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] чтобы избежать перезаписи элемента другим?

🤔 А знаете ли вы, что...
Go поддерживает множество платформ, включая Windows, Linux и macOS.


3
48
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, но логика для этого будет более сложной, и ее использование также будет более сложным, поскольку вам всегда нужно проверять, что это такое и делать утверждение типа и так далее. Ведь я бы не советовал.