在Golang中将值类型转换为Map?

时间:2013-12-21 00:23:11

标签: reflection go

我从“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)

2 个答案:

答案 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 assertiontype 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并且经常是冗长而且非常棘手。