Go

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

发布于 2021-02-01 10:36:16

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

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"}

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

关注者
0
被浏览
862
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

    让我们来看一下:

    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之行更加熟悉这些概念。



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看