示例代码:
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)
问题:
如何访问此界面中的密钥呢?
我是否必须使用方法集来定义更精细的界面来实现此目的?
答案 0 :(得分:5)
由于切片类型为[]interface{}
,因此对此切片建立索引将为您提供类型为interface{}
的元素。无法为interface{}
类型的值编制索引。
但是由于您将map[string]string
类型的值放入其中,您可以使用来获取该地图类型的值,您可以正确索引:
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",
},
}