2015-11-20 2 views
1

Я работаю над веб-приложением с языком Go. Функция respond(writer, html, *params) нуждается в списке параметров, которые можно использовать для визуализации HTML-страницы. Я пришел с картой, так как это, который работает отлично:Тип общего значения Go map

&map[string][]string 

Однако, в последнее время мне нужно сжать в паре значений в формате {string, map[string][]string}, который, очевидно, взорвал компилятор. Поэтому мне интересно, есть ли какой-либо общий тип, который я могу использовать, т. Е. map[string]GenericType.

Любые мысли приветствуются.

+2

Возможно, если вы выразите желаемый результат и что именно «ответит», мы можем помочь лучше, чем рекомендовать что-то недружелюбное, как 'map [string] [] interface {}', что может быть слишком общим. Поскольку ваш вопрос в настоящее время сформулирован, трудно понять, что рекомендовать, потому что невозможно понять, какова ваша цель с ответом. Вы предоставили слишком мало информации о том, что вы хотите сделать для кого-либо, чтобы предоставить хорошую рекомендацию. Что делает «ответ»? Что такое '* params' и как это влияет на вещи? –

ответ

2

Таким образом, вы обычно храните []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.

Смежные вопросы