示例代码:
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{}
,索引此切片将为您提供类型的元素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]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", }, }