项目列表的Golang类型断言

时间:2018-08-11 19:52:59

标签: dictionary go slice type-assertion

我正在调用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 {}

我的类型转换应该是什么?

1 个答案:

答案 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