Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang: cast interface back to its original type

Tags:

reflection

go

I couldn't really find an answer to this, even though I looked up the Go documentation and examples. Is it possible to cast an interface back to its original type, dynamically? I know I can do something like this:

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

But here I know the type. I would like to have a map of unknown types (interfaces) and cast them back by using reflection, like this:

// 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

Like this it would by possible to store anything within a single map. The type will be handed in by the user when calling pop() (second argument is an interface). Is it possible to achive this using reflection?

like image 385
Kugel Avatar asked Nov 09 '16 17:11

Kugel


1 Answers

You can't assert a type from an interface without knowing what that type is at compile time, but you can set a value from an interface via reflection. Here's an example without any error checks, which panics when any parameters don't match:

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

like image 140
JimB Avatar answered Sep 19 '22 07:09

JimB