Таким образом, вы обычно храните []string
значений для string
ключей. Большую часть времени. И время от времени вы хотите сохранить значение map[string][]string
для ключа string
.
Сначала отбросьте указатель на тип карты: карты уже являются маленькими дескрипторами, вы можете передавать карты, которые будут передавать копию дескриптора, а не весь контент, и если вы добавите новую пару ключ-значение в копия, вы увидите это в оригинале. Передача карты по значению является эффективной и имеет желаемый эффект/работу.
Чтобы быть точным: типы карт на самом деле являются указателями на дескриптор карты под капотом, но это детализация реализации, вам не нужно знать это, чтобы использовать/работать с картами. Важно только то, что вы можете эффективно передавать значения карт.
Имея только одну карту и возможность хранения значений обоих типов []string
и map[string][]string
потребовались бы вам, чтобы изменить тип значения interface{}
, но для этого потребуется вам использовать Type assertion каждый раз, когда вы получаете доступ к элементу в Params карта, что-то вроде:
params := map[string]interface{}{}
params["a"] = []string{"b", "c"}
if list, ok := params["a"].([]string); ok {
fmt.Println(list)
}
конечно, вы можете создать новый тип с map[string]interface{}
является его базовым типом, и добавить Get()
и Set()
метод для наиболее распространенного типа значения []string
, но вместо этого я рекомендую обертку struct
для Params, с несколькими картами в нескольких областях:
type Params struct {
P map[string][]string
M map[string]map[string][]string
}
Ваш код может использовать карту в зависимости от того имеет тип значения, который соответствует значение, которое будет храниться, например:
params2 := Params{map[string][]string{}, map[string]map[string][]string{}}
params2.P["a"] = []string{"b", "c"}
params2.M["B"] = map[string][]string{
"x": []string{"X", "Y"},
}
fmt.Println(params2.P["a"])
fmt.Println(params2.M["B"])
Вы можете также добавьте Get()
и Set()
методы к Params
, которые получают и устанавливают элементы из наиболее часто используемой карты Params.P
.
Попробуйте на Go Playground.
Возможно, если вы выразите желаемый результат и что именно «ответит», мы можем помочь лучше, чем рекомендовать что-то недружелюбное, как 'map [string] [] interface {}', что может быть слишком общим. Поскольку ваш вопрос в настоящее время сформулирован, трудно понять, что рекомендовать, потому что невозможно понять, какова ваша цель с ответом. Вы предоставили слишком мало информации о том, что вы хотите сделать для кого-либо, чтобы предоставить хорошую рекомендацию. Что делает «ответ»? Что такое '* params' и как это влияет на вещи? –