当前位置: 首页 > 面试题库 >

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

索瀚海
2023-03-14
问题内容

我在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


问题答案:

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

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

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


 类似资料:
  • 我是一个新手,正在尝试编写一个简单的应用程序,从大学校中提取一些学校数据。组织。json数据如下所示: 我的结构如下所示: 当我运行代码时,我得到“json:无法将对象解组为[]main.SchoolStruct类型的Go值” 我正在使用gopencils库来提出我的请求,并成功地将其用于非常简单的请求。你知道我可能做错了什么吗?

  • 问题内容: 我正在尝试将一些JSON数据反序列化为应用程序的对象。到现在为止还不错,因为JSON数据上的属性是静态的(带有值的键)。现在,我得到了一个结果,其中的关键是动态数据。 这是一个示例JSON网址: http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info 由此产生的JSON是: 好的

  • 目前,我正在使用Avro1.8.0序列化/反序列化对象,但面临一些问题,特别是java.util.Map对象。不面临其他类型对象的问题。 这里的示例代码- 在deserialize方法中,我试图根据输入数据获取模式,但avro抛出错误- 多谢了。

  • 问题内容: 我正在尝试使用该包将Go结构转换为JSON,但我得到的只是。我敢肯定这是完全显而易见的,但我看不到。 然后,当我尝试运行它时,我得到以下信息: 问题答案: 您需要导出的字段,以便在包装可以看到它。将字段重命名为。 输出:

  • 我试图在Go中创建一个泛型方法,该方法将使用来自< code > map[string]interface { } 的数据填充< code>struct。例如,方法签名和用法可能如下所示: 我知道使用JSON作为中介可以做到这一点;有没有其他更有效的方法?