示例代码:
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{},因此索引该分片将为您提供type的元素interface{}。类型的值interface{}无法建立索引。
[]interface{}
interface{}
但是由于您将类型的值map[string]string放入其中,因此可以使用类型断言来获取该映射类型的值,您可以对其进行正确索引:
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
example_container := []map[string]string{ map[string]string{ "name": "bob", "id": "1", }, map[string]string{ "name": "jim", "id": "2", }, }
然后,您不需要类型声明就可以访问名称:
在Go Playground上尝试一下。
还要注意,在用于初始化example_container切片的复合文字中,列出元素时甚至可以省略地图类型:
example_container := []map[string]string{ { "name": "bob", "id": "1", }, { "name": "jim", "id": "2", }, }