【发布时间】:2016-04-05 14:39:52
【问题描述】:
我正在尝试创建一个可以接受键字符串和对象引用的通用函数。
该函数读取一个键的内容,它是一个从相同类型的原始对象中序列化的字节数组,它应该将它分配(反序列化)到一个相同类型的空结构。该函数希望是通用的,因此它可以序列化类型 A 以及 B 或 []C
这是我尝试做的:
func GetObject(key string, thing interface{}) error {
var buf bytes.Buffer
dec := gob.NewDecoder(&buf)
err := dec.Decode(thing)
if err != nil {
log.Errorf(cs.ctx, "cloud store - GetObject - decode error:", err)
return err
}
return nil
}
这就是我尝试调用上述函数的方式:
newThing := MyStruct{}
err := GetObject("a123", &newThing)
关于导致运行时错误的最后几行:
decode error:%!(EXTRA *errors.errorString=EOF)
问题:
- 接口方法是否适用于此目的(允许通用功能)?
- 序列化错误(使用 Gob)似乎有问题。关于如何纠正的任何建议?
【问题讨论】:
-
您的代码似乎是倒退的。如果您正在解码,您不会传入一个字节切片吗?
-
别这样,你会伤到自己。忘记任何“通用”的东西。如果你想从某个后端加载多个对象:让它们都实现一个特定的接口,该接口具有 []byte 到对象反序列化所需的所有方法。
-
@ZanLynx 你是对的。我错过了示例中从商店读取的解码器...我会尽快更新代码。
-
我能够解决。由于这是第一次尝试使用这样的接口,所以我对该层持怀疑态度,但我忘记了添加字节数据。所以缺少的是: content, _ := cs.Get(fileName);缓冲区 := bytes.NewBuffer(content); dec := gob.NewDecoder(buffer)
标签: go