如何强制接口对象做一些索引操作?

时间:2018-05-03 09:06:47

标签: json go

我的日志数据源看起来像:

  

{ “LogtypeA”:{ “内容”: “listen_logs”:[{ “useful_key1”:VAL1, “useful_key2”:val2的},{ “useful_key1”:VAL1}]}}

然后我使用simplejson来解析它们。 listen_logs 的值是包含至少一个地图的切片。 代码是:

for _, v := range js.Get("LogTypeA").Get("content").Get("listen_logs").MustArray() {
        _obj := reflect.ValueOf(v)
        fmt.Println(_obj.Kind())
    }

如果我用MustArray()替换Array(),它将报告不正确的变量和常量声明。 使用反射模块我会发现_obj.Kind()是地图,但我无法使用任何索引方法从v获取值,例如:

_val1 := v["useful_key1"]

for i, v := range v {...}

因为类型interface{}不支持索引。 那么我应该如何从这些日志中提取那些有用的keyX

1 个答案:

答案 0 :(得分:1)

您需要在结果地图上执行类型断言:

new_v := v.(map[string]interface{})
_val1 := new_v["useful_key1"]

或者,如果您不确定它是否为地图:

new_v, ok := v.(map[string]interface{})
if ok {
    // it was a map from strings to something
    _val1 := new_v["useful_key1"]
} else {
    print("Could not interpret v as a map.")
}

由于它最初是一个空接口,即interface{},这意味着它可以是任何类型。因此,您需要指定在尝试访问项目之前将其视为地图。