2015-01-07 68 views
3

我有地圖,有一個零鍵控值:如何使用反射訪問地圖的無鑰匙?

mapp := map[interface{}]interface{}{ 
    nil: "a", 
} 

訪問它的無鑰匙的直接作用:

fmt.Println("key[nil]:", mapp[nil]) 

但使用反射不 - 如何做到這一點?

rmapp := reflect.ValueOf(mapp) 
rkey := reflect.ValueOf(interface{}(nil)) 
rval := rmapp.MapIndex(rmapp.MapIndex(rkey)) 
fmt.Println("key[nil]:", rval) 

非工作代碼在這裏:
https://play.golang.org/p/6TKN_tDNgV

回答

2

缺少的部分似乎是零值地圖的鍵類型,這是需要訪問地圖的零鍵。

refmap.MapIndex(reflect.Zero(refmap.Type().Key())) 

playground example

5

下面就來爲interface{}類型的nil價值創造reflect.Value一種方法:

rkey := reflect.ValueOf(new(interface{})).Elem() 

playground example

+0

謝謝你,但這種方法需要知道地圖的關鍵在編譯時的類型,因此無法與其他主要類型。 – Gima