我从“reflect”包中的函数调用中获取此返回值:
< map[string]string Value >
。
想知道我是否可以访问返回值中的实际地图,如果是,如何?
编辑:
所以这就是我正在进行返回Value对象的调用。
它返回[< map[string]string Value >]
,我抓住该数组中的第一个对象。但是,我不确定如何将[< map[string]string Value >]
转换为常规地图。
view_args := reflect.ValueOf(&controller_ref).MethodByName(action_name).Call(in)
答案 0 :(得分:16)
大多数反映Value
个对象都可以使用.Interface()
method转换回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
,并且此值在最后一行中使用。
答案 1 :(得分:8)
要将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并且经常是冗长而且非常棘手。