Golang:将界面转换回原始类型

时间:2016-11-09 17:03:23

标签: go reflection

即使我查阅了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

像这样可以在一张地图中存储任何东西。当调用pop()(第二个参数是接口)时,用户将输入类型。是否有可能使用反射来实现这一目标?

1 个答案:

答案 0 :(得分:7)

您无法在不知道编译时该类型的情况下从接口断言类型,但您可以通过反射从接口设置值。这是一个没有任何错误检查的例子,当任何参数不匹配时会发生恐慌:

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