我正在调用API,它会返回一个字典(地图),其中包含一系列项目作为值。
例如:-
result= {'outputs':[{'state':'md','country':'us'}, {'state':'ny','country':'ny'}]}
以上数据是python中数据的表示方式。
在Python中,我直接使用result ['outputs'] [0]访问列表中的元素列表。
在Golang中,相同的API返回数据,但是当我尝试以result ['outputs'] [0]
访问数据时遇到此错误:-
invalid operation: result["outputs"][0] (type interface {} does not support indexing)
看起来我需要进行类型转换,我应该使用哪种类型进行转换, 我尝试过
result["outputs"][0].(List)
result["outputs"][0].([])
但都抛出一个错误。
我检查了退回商品的类型,它就是它-[] interface {}
我的类型转换应该是什么?
答案 0 :(得分:0)
您将值的类型写为[]interface{}
,然后执行type assertion声明该类型。
还请注意,您首先必须输入assert,然后再进行索引,例如:
outputs := result["outputs"].([]interface{})
firstOutput := outputs[0]
还要注意,firstOutput
的(静态)类型将再次为interface{}
。要访问其内容,您将需要另一个类型声明,最有可能是map[string]interface{}
或map[interface{}]interface{}
。
如果可以的话,可以使用结构为数据建模,这样就不必进行“类型断言废话”了。
还要注意,有第3方库支持在诸如您的动态对象内进行轻松的“导航”。其中一个是github.com/icza/dyno
(公开:我是作者)。
使用dyno
,获得第一个输出将是:
firstOutput, err := dyno.Get(result, "outputs", 0)
要获取第一个输出的国家/地区:
country, err := dyno.Get(result, "outputs", 0, "country")
您还可以“重用”以前查找的值,如下所示:
firstOutput, err := dyno.Get(result, "outputs", 0)
// check error
country, err := dyno.Get(firstOutput, "country")
// check error