当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《无法访问[]界面内的地图中的密钥》经验,为你挑选了1个好方法。

示例代码:

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> icza..:

由于切片类型是[]interface{},索引此切片将为您提供类型的元素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",
    },
}

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有