一尘不染

类型为嵌套的map [string] interface {}的映射返回“类型interface {}不支持索引”

go

我在使用类型化嵌套地图时遇到一个非常奇怪的问题。

gore version 0.2.6  :help for help
gore> type M map[string]interface{}
gore> m := M{"d": M{}}
main.M{"d":main.M{}}
gore> m["d"]["test"] = "will fail"
# command-line-arguments
/tmp/288178778/gore_session.go:13:8: invalid operation: m["d"]["test"] (type interface {} does not support indexing)
/tmp/288178778/gore_session.go:14:17: invalid operation: m["d"]["test"] (type interface {} does not support indexing)
error: exit status 2
exit status 2
gore> m["e"] = "this works"
"this works"
gore> m
main.M{"d":main.M{}, "e":"this works"}

我究竟做错了什么?为什么仅由于地图嵌套在地图中而突然失败?


阅读 573

收藏
2020-07-02

共1个答案

一尘不染

让我们来看一下:

foo:=map[string]interface{}{}

定义时map[string]interface{},可以为给定的字符串索引设置所需的任何类型(满足
空接口 interface{}协定的任何类型,也可以是任何类型)。

foo["bar"]="baz"
foo["baz"]=1234
foo["foobar"]=&SomeType{}

但是,当您尝试访问某些键时,您不会得到一些int,字符串或任何自定义结构,但会得到一个 interface{}

var bar string = foo["bar"] // error

为了将其bar视为字符串,您可以进行类型断言类型切换

在这里,我们进行类型断言(实时示例):

if bar,ok := foo["bar"].(string); ok {
   fmt.Println(bar)
}

但是正如@Volker所说的,作为一个初学者,这是一个好主意,使go之行更加熟悉这些概念。

2020-07-02