[英]Golang type assertion for list of items
我调用一个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 {}
我的类型转换应该是什么?
您将值的类型写为[]interface{}
,然后执行类型断言来声明该类型。
还要注意,您首先必须输入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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.