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

无法访问[]界面内的映射中的键

葛烨
2023-03-14
问题内容

示例代码:

package main

import "fmt"

func main() {
    example_container := []interface{}{
        map[string]string{
            "name": "bob",
            "id": "1",
        },
        map[string]string{
            "name": "jim",
            "id": "2",
        },
    }
    fmt.Printf("%v\n", example_container)
    fmt.Printf("%v\n", example_container[0])
    fmt.Printf("%v\n", example_container[0]["name"])
}

问题行:

fmt.Printf("%v\n", example_container[0]["name"])

错误:

invalid operation: example_container[0]["name"] (type interface {} does not support indexing)

题:

那么,如何访问该界面内的键?

我是否需要使用方法集定义更复杂的接口来完成此操作?


问题答案:

由于您的分片类型为[]interface{},因此索引该分片将为您提供type的元素interface{}。类型的值interface{}无法建立索引。

但是由于您将类型的值map[string]string放入其中,因此可以使用类型断言来获取该映射类型的值,您可以对其进行正确索引:

fmt.Printf("%v\n", example_container[0].(map[string]string)["name"])

输出(在Go Playground上尝试):

[map[name:bob id:1] map[name:jim id:2]]
map[name:bob id:1]
bob

如果您知道总是将类型的值存储map[string]stringexample_container切片中,则最好按以下方式对其进行定义:

example_container := []map[string]string{
    map[string]string{
        "name": "bob",
        "id":   "1",
    },
    map[string]string{
        "name": "jim",
        "id":   "2",
    },
}

然后,您不需要类型声明就可以访问名称:

fmt.Printf("%v\n", example_container[0]["name"])

在Go Playground上尝试一下。

还要注意,在用于初始化example_container切片的复合文字中,列出元素时甚至可以省略地图类型:

example_container := []map[string]string{
    {
        "name": "bob",
        "id":   "1",
    },
    {
        "name": "jim",
        "id":   "2",
    },
}


 类似资料:
  • 问题内容: 假设以下 为什么无法访问现在存储在映射中的struct实例? 任何人都可以阐明如何访问映射存储的结构,或为何无法访问它的逻辑? 笔记 我知道您可以通过复制结构,更改副本并将其复制回到地图中来实现这一点-但这是一项昂贵的复制操作。 我也知道这可以通过在我的地图中存储结构指针来完成,但是我也不想这样做。 问题答案: 根本问题是您无法获取地图中某物的地址。您可能会认为编译会重新安排为 但这不

  • 我使用Micronaut 3.2.3和Kubernetes集成,从配置映射和机密中注入配置值。 依赖: bootstrap.yml 如您所见,应用程序配置图包括kafka.brokers值: 我添加了一个简单的单例类,用于检查是否可以注入项目: 日志跟踪似乎表明这些配置映射已被正确访问: 但是,应用程序崩溃,因为它找不到它:

  • 我们需要访问strut操作类中定义的实例映射(它有get/set方法)。我们需要动态填充地图。我们生成代码,在运行时使用基于一些用户输入的java脚本填充地图。我们使用freemarker作为模板。 ftl中的Java脚本代码如下所示: 这里的是

  • 我已经用伪分布式模式安装了Hadoop 3.1.1。我尝试访问Hadoop Web界面,NameNode()和JobHistoryServer()UI打开良好,但DataNode()、ResourceManager()UI被阻止。 但是,当我使用命令时,DataNode和ResourceManager仍然在工作。此外,日志文件中没有任何特殊的错误消息。 我想知道是什么问题。 大师: 奴隶: hdf

  • 问题内容: 在具有并发访问的程序中使用映射时,是否需要在函数中使用互斥体来 读取 值? 问题答案: 读者众多,没有作家可以: https://groups.google.com/d/msg/golang- nuts/HpLWnGTp-n8/hyUYmnWJqiQJ 一个作家,没有读者是可以的。(否则,地图不会太好。) 否则,如果至少有一个作家,而作家或读者至少还有一个,那么 所有 读者 和 作家都

  • 我在使用reflections api的公共类中的私有类中使用私有方法时遇到问题。下面是一个简化的代码示例: 同样,我希望能够实例化一个类对象,然后从私有类调用。我一直试图通过反射来做到这一点,但我似乎无法超过1级。此外,内部类可能有也可能没有大多数代码似乎使用的构造函数。上面的代码只是框架。 我当前的代码: 我查找了各种方法来获取内部类或私有方法,但找不到在不使用构造函数的情况下将外部对象获取到