一尘不染

使用反射将数据从序列化动态转换回Go结构的问题

go

我在Go中使用反射将缓存中的数据动态地提取为各种静态声明的struct类型时遇到了麻烦:

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…:\

无需将这些数据保存在代码中的其他位置到缓存中reflect


阅读 302

收藏
2020-07-02

共1个答案

一尘不染

memcache.Gob.Get()这是Codec.Get()期望的“目标”为指针,包裹成一个interface{}

fetchFromCache已经足够了:指向returnType包装在中的指定类型()的值的指针interface{}。因此,在将其传递给Gob.Get():时按原样传递它时无需使用其地址:

_, err=memcache.Gob.Get(*context, cacheKey, fetchFromCache)
2020-07-02