我在使用类型化嵌套地图时遇到一个非常奇怪的问题。
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"}
我究竟做错了什么?为什么仅由于地图嵌套在地图中而突然失败?
让我们来看一下:
foo:=map[string]interface{}{}
定义时map[string]interface{},可以为给定的字符串索引设置所需的任何类型(满足 空接口 interface{}协定的任何类型,也可以是任何类型)。
map[string]interface{}
interface{}
foo["bar"]="baz" foo["baz"]=1234 foo["foobar"]=&SomeType{}
但是,当您尝试访问某些键时,您不会得到一些int,字符串或任何自定义结构,但会得到一个 interface{}
var bar string = foo["bar"] // error
为了将其bar视为字符串,您可以进行类型断言或类型切换。
bar
在这里,我们进行类型断言(实时示例):
if bar,ok := foo["bar"].(string); ok { fmt.Println(bar) }
但是正如@Volker所说的,作为一个初学者,这是一个好主意,使go之行更加熟悉这些概念。