Преобразовать тип значения в карту в Голанге?
Я получаю это возвращаемое значение из вызова функции в пакете "отражать":
< 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 и часто многословно и довольно сложно.