2013-12-21 3 views
10

Я получаю это возвращаемое значение от вызова функции в пакете «отражение»:Преобразование типа ценности в карту в Голанге?

< 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

Можете ли вы дать нам немного больше образца кода? –

+0

Конечно! Отредактировано :) – user1493543

ответ

14

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

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

+1

Совершенно, я уверен, что тот, что ниже, тоже работает, это именно то, что мне нужно. Большое спасибо :) – user1493543

7

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

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

switch item := iface.(type) { 
case map[string]string: 
    fmt.Println("it's a map, and key \"key\" is", item["key"]) 
case string: 
    fmt.Println("it's a string:", item) 
default: 
    // optional--code that runs if it's 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, и, по моему опыту, это связано с длительным просмотром the reflect docs и часто многословным и довольно сложным ,

+0

Спасибо за ответ! – user1493543

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