2016-11-09 46 views
3

即使我查閱了Go文檔和示例,我也無法真正找到答案。是否可以動態地將界面轉換回原始類型?我知道我可以做這樣的事情:Golang:將界面恢復到原始類型

var myint int = 5 
var myinterface interface{} 
myinterface = myint 
recovered, _ := myinterface.(int) 
fmt.Println(recovered) 

但是在這裏我知道類型。我想有一個地圖類型未知(接口),並通過使用反射,這樣的投他們回來:

// put/pop writes/read to/from a map[string]interface{} 
var myint int = 5 
put("key" myint) 
pop("key", &myint) // this should also work for objects or any other type 

喜歡這個將由可以在一張地圖內的任何存儲。當調用pop()(第二個參數是一個接口)時,該類型將由用戶交付。是否有可能通過反射來實現這一點?

回答

4

您不能在編譯時不知道類型是什麼,而是從接口斷言類型,但是您可以通過反射設置接口的值。這裏有一個例子,沒有任何錯誤檢查,當任一參數不匹配,其恐慌:

var m = map[string]interface{}{} 

func put(k string, v interface{}) { 
    m[k] = v 
} 

func pop(k string, o interface{}) { 
    reflect.ValueOf(o).Elem().Set(reflect.ValueOf(m[k])) 
} 

https://play.golang.org/p/ORcKhtU_3O

+0

正是我一直在尋找。謝謝 :) – Kugel