小编典典

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

go

示例代码:

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)

题:

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

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


阅读 331

收藏
2020-07-02

共1个答案

小编典典

由于您的分片类型为[]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",
    },
}
2020-07-02