当前位置: 首页 > 面试题库 >

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

盖雪峰
2023-03-14
问题内容

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

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{}协定的任何类型,也可以是任何类型)。

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



 类似资料:
  • 问题内容: 因此,我正在尝试解析JSON响应。它可以是多个层次。这是我所做的: 首先,这是正确的方法吗? 可以说响应如下: 要访问key ,我看到一个游乐场正在这样做: 在这里,表示法是什么?这样对吗? 问题答案: 该符号称为类型断言。 对于接口类型和类型的表达式,主表达式断言不是,并且其中存储的值是类型。 你的例子: 这意味着与key关联的地图的值是类型(另一个具有key和任何值的地图)。并且您

  • 问题内容: 从来源来看,我无法影响我在地图中获得的数据,该地图以表示。 我需要处理所包含的数据,最好是(其中的数据非常适合该处理)。 我还需要从数据中生成键列表,因为这些键是事先未知的。 我可以在网上找到的大多数类似问题或多或少都说这是不可能的,但是如果我的地图是,则表明数据在那里,可读性为。 我该怎么办fmt.Println可以做什么? 问题答案: 处理未知接口的一种安全方法,只需使用fmt.S

  • 问题内容: 无法编码 http://play.golang.org/p/Si4hd8I0JE 可以在gob中编码吗?我可以用JSON编码 问题答案: 加 http://play.golang.org/p/Dd3IzJgl0A

  • 问题内容: 我正在尝试为如下对象创建动态映射: 我希望属性为嵌套类型,该类型是我在下面的映射中使用nested_feature模板定义的,并且按预期工作。但是,我也想让属性的嵌套对象中的每个属性都带有定义的其他属性。我尝试了第二个nested_template模板,但没有成功。 不幸的是,属性中的属性是从另一个进程创建的,几乎可以是任何名称/值对。关于如何使用动态模板将属性设置为嵌套的任何建议,以

  • 我试图为对象创建一个动态映射,如下所示:

  • 我要在颤栗中继续我的旅程。我能够在ListView中显示一个简单的json。现在我尝试使用带有嵌套对象的json,但每次运行应用程序时都会出现错误 我正在为json模型类生成代码,如颤振官方文档中建议的那样。 这个错误似乎是在我分析用户时发生的。在调试时,我看到名称和姓氏被成功解析,但当我跳转到user中的details对象时。g、 在行中省道: 我看到错误: 如何解决此错误,以及如何访问所有嵌套