繁体   English   中英

项目列表的Golang类型断言

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM