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