2017-01-12 29 views
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) 

問題:

如何訪問此界面中的按鍵?

我必須定義一個更復雜的接口和方法集來完成這個嗎?

回答

5

由於您的切片類型爲[]interface{},因此對此切片進行索引可爲您提供interface{}類型的元素。 interface{}類型的值無法編入索引。

但既然你把map[string]string類型的值到它,你可以使用type assertion來獲得地圖類型的值,你可以索引正確:

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 

如果你知道你將永遠保存在您的example_containermap[string]string類型的值,最好將它定義成這樣:

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", 
    }, 
} 
+0

太感謝了,這有很大幫助。不幸的是,這是一個功能,爲我創造了一個我還不明白的切片。我傳入一個指向我的'[] interface'的指針作爲參數,並用地圖填充'[] interface'。至少現在我可以遍歷它們並訪問密鑰。 –