【问题标题】:Creating a function in Go with generic type parameters在 Go 中使用泛型类型参数创建函数
【发布时间】: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


【解决方案1】:

接口的概念是正确的。该问题与持久存储中缺少的 getter 以及如何从其 []byte 内容创建缓冲区有关:

func GetObject(key string, thing interface{}) error {
    content, _ := SomePersistanceStoreGet(fileName)
    buffer := bytes.NewBuffer(content)
    dec := gob.NewDecoder(buffer)
   err := dec.Decode(thing)
    if err != nil {
        log.Errorf("decode error: %v", err)
        return err
    }
    return nil
}

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2011-11-25
    相关资源
    最近更新 更多