我找不到这个问题的答案,即使我查阅了Go文档和示例。是否有可能动态地将接口强制转换回其原始类型?我知道我可以这样做:
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
这样就可以在一个map中存储任何东西。该类型将由用户在调用pop()时提交(第二个参数是一个接口)。有可能使用反射来实现这一点吗?
如果在编译时不知道该类型是什么,则不能从接口断言该类型,但可以通过反射从接口设置值。下面是一个没有任何错误检查的例子,当任何参数不匹配时,它会出现恐慌:
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