2016-11-09 3 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

Смежные вопросы