Преобразовать тип значения в карту в Голанге?

Я получаю это возвращаемое значение из вызова функции в пакете "отражать":

< map[string]string Value >.

Интересно, могу ли я получить доступ к фактической карте внутри возвращаемого значения, и если да, то как?

EDIT:

Итак, вот где я делаю вызов, который возвращает объект Value. Он возвращает [< map[string]string Value >], к которому я захватываю первый объект в этом массиве. Однако я не уверен, как преобразовать [< map[string]string Value >] в обычную карту.

view_args := reflect.ValueOf(&controller_ref).MethodByName(action_name).Call(in)

Ответ 1

Большинство отражают Value объекты могут быть преобразованы обратно в значение interface{} с помощью метода .Interface().

После получения этого значения вы можете вернуть его обратно на нужную вам карту. Пример (play):

m := map[string]int{"foo": 1, "bar": 3}
v := reflect.ValueOf(m)
i := v.Interface()
a := i.(map[string]int)

println(a["foo"]) // 1

В приведенном выше примере m - ваша исходная карта, а v - отраженное значение. Значение интерфейса i, полученное с помощью метода Interface, считается типом map[string]int, и это значение используется как таковое в последней строке.

Ответ 2

Чтобы превратить значение в reflect.Value в interface{}, вы используете iface := v.Interface(). Затем, чтобы получить доступ к этому, вы используете тип утверждения или переключатель типа.

Если вы знаете, что получаете map[string]string, утверждение просто m := iface.(map[string]string). Если есть несколько возможностей, тип переключателя для их обработки выглядит следующим образом:

switch item := iface.(type) {
case map[string]string:
    fmt.Println("it a map, and key \"key\" is", item["key"])
case string:
    fmt.Println("it a string:", item)
default:
    // optional--code that runs if it none of the above types
    // could use reflect to access the object if that makes sense
    // or could do an error return or panic if appropriate
    fmt.Println("unknown type")
}

Конечно, это работает только в том случае, если вы можете выписать все конкретные типы, которые вам интересны в коде. Если во время компиляции вы не знаете возможные типы, вы должны использовать методы, такие как v.MapKeys() и v.MapIndex(key), чтобы больше работать с reflect.Value, и, по моему опыту, это длительное время смотрит на reflect docs и часто многословно и довольно сложно.