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)谢谢你纠正我,你说得对。我现在编辑我的答案