Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 类型接口{}不支持golang中的索引_Arrays_Dictionary_Go_Indexing - Fatal编程技术网

Arrays 类型接口{}不支持golang中的索引

Arrays 类型接口{}不支持golang中的索引,arrays,dictionary,go,indexing,Arrays,Dictionary,Go,Indexing,我有这样的地图: Map := make(map[string]interface{}) 这个映射应该包含从字符串到对象数组的映射。数组可以是不同的类型,如[]用户或[]主机。我填充了这个数组: TopologyMap["Users"] = Users_Array TopologyMap["Hosts"] = Hosts_Array 但当我试图从中获取元素时: Map["Users"][0] 它给出了一个错误: (类型接口{}不支持索引) 如何克服它?您必须显式地将接口{}转换为预期类型的

我有这样的地图:

Map := make(map[string]interface{})
这个映射应该包含从字符串到对象数组的映射。数组可以是不同的类型,如
[]用户
[]主机
。我填充了这个数组:

TopologyMap["Users"] = Users_Array
TopologyMap["Hosts"] = Hosts_Array
但当我试图从中获取元素时:

Map["Users"][0]
它给出了一个错误:
(类型接口{}不支持索引)


如何克服它?

您必须显式地将接口{}转换为预期类型的片段才能实现它。像这样的
首先要注意的是
接口{}
可以保存任何数据类型,包括
函数
结构
[]结构
。由于该错误为您提供:

(类型接口{}不支持索引)

这意味着它不包含
切片
数组
值。因为直接调用
索引
在本例中是
0
接口{}
,并且假设
映射[“用户”]
是一个数组。但事实并非如此。这是Go的一个非常好的特性,它是静态类型,这意味着所有的数据类型都是在编译时检查的

如果要避免以下解析错误:

死机:接口转换:接口{}是[]main.User,不是 []main.Host

避免将错误解析为另一种类型,如<代码> MAP[[用户] ]([]用户)< /代码>,以防另一数据类型传递到<代码>接口{} /代码>:请考虑下面的代码片段:

u, ok := myMap["user"].([]User)
if ok {
    log.Printf("value = %+v\n", u)
}
上面的代码很简单,您可以使用它来检查接口是否与正在解析的类型匹配

如果您想更一般地将值传递给您的代码>接口{} /Cube,在运行时,您可以首先使用<代码>反映.Type()/代码>检查此代码:请考虑此代码:

switch reflect.TypeOf(myMap["user"]).String() {
case "[]main.User":
    log.Println("map = ", "slice of user")
    logger.Debug("map = ", myMap["user"].([]User)[0])

case "[]main.Host":
    log.Println("map = ", "slice of host")
    logger.Debug("map = ", myMap["user"].([]Host)[0])

}

在您知道
接口{}
的值之后,您可以自信地将其解析为您的特定数据类型(在本例中是user
[]user
的片段)。并不是说
main
中有一个包名,您可以将其更改为您的包名。

是的,这很好,但是在填充
Map
时是否可以这样做,以避免像这样的额外分配
hm:=Map[“hosts”]([]Host)
?这里没有理由进行反射。使用类型断言的两值形式来避免恐慌:u,ok:=myMap[“user”]。([]user)谢谢你纠正我,你说得对。我现在编辑我的答案