I'm having trouble using reflection in Go to fetch data from a cache dynamically into various statically declared struct types:
func FetchFromCacheOrSomewhereElse(cacheKey string, returnType reflect.Type) (out interface {}, err error) {
fetchFromCache := reflect.New(returnType).Interface();
_, err=memcache.Gob.Get(*context, cacheKey, &fetchFromCache);
if (err==nil) {
out=reflect.ValueOf(fetchFromCache).Elem().Interface();
} else if (err==memcache.ErrCacheMiss) {
/* Fetch data manually... */
}
return out, err;
}
It seems that reflect
won't translate this statically typed cache data back into a reflect value, and returns this error instead: gob: local interface type *interface {} can only be decoded from remote interface type; received concrete type
... :\
This data is saved elsewhere in the code to the cache without the need for reflect
.
memcache.Gob.Get()
which isCodec.Get()
expects the "target" as a pointer, wrapped into aninterface{}
.Your
fetchFromCache
is already just that: a pointer to a value of the specified type (returnType
) wrapped in aninterface{}
. So you don't need to take its address when passing it toGob.Get()
: pass it as-is: