我在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
gob: local interface type *interface {} can only be decoded from remote interface type; received concrete type
无需将这些数据保存在代码中的其他位置到缓存中reflect。
memcache.Gob.Get()这是Codec.Get()期望的“目标”为指针,包裹成一个interface{}。
memcache.Gob.Get()
Codec.Get()
interface{}
您fetchFromCache已经足够了:指向returnType包装在中的指定类型()的值的指针interface{}。因此,在将其传递给Gob.Get():时按原样传递它时无需使用其地址:
fetchFromCache
returnType
Gob.Get()
_, err=memcache.Gob.Get(*context, cacheKey, fetchFromCache)