问题翻译数据从串行化回转到​​结构动态地使用反射(Issue translating data ba

2019-09-28 12:37发布

我使用反射在转到动态地从缓存中获取数据到各种静态声明的结构类型时遇到问题:

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;

}

似乎reflect不会这个静态类型的缓存中的数据转换回一个体现价值,而是返回此错误: gob: local interface type *interface {} can only be decoded from remote interface type; received concrete type gob: local interface type *interface {} can only be decoded from remote interface type; received concrete type ...:\

该数据在代码中缓存保存在别处,而不需要reflect

Answer 1:

memcache.Gob.Get()这是Codec.Get()期望“目标”为指针,裹入interface{}

您的fetchFromCache已经只是:一个指针为指定的类型(的值returnType包裹在一个) interface{} 所以,你不需要它传递到何时采取其地址Gob.Get()把它作为-是:

_, err=memcache.Gob.Get(*context, cacheKey, fetchFromCache)


文章来源: Issue translating data back from serialization into Go struct dynamically using reflection