无法访问[]界面内的地图中的密钥

时间:2017-01-12 09:04:29

标签: dictionary go interface

示例代码:

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)

问题:

如何访问此界面中的密钥呢?

我是否必须使用方法集来定义更精细的界面来实现此目的?

1 个答案:

答案 0 :(得分:5)

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

但是由于您将map[string]string类型的值放入其中,您可以使用enter image description here来获取该地图类型的值,您可以正确索引:

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

输出(在type assertion上尝试):

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

如果您知道自己将始终在map[string]string切片中存储example_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",
    },
}