gob:类型未注册接口:[]interface

Posted

技术标签:

【中文标题】gob:类型未注册接口:[]interface【英文标题】:gob: type not registered for interface: []interface 【发布时间】:2018-05-22 08:19:10 【问题描述】:

我正在尝试将地图复制到另一张地图,因此我使用 gob 来执行此操作。 但是当我将 json 解组为 map[string]interface 然后尝试将其复制到另一个地图时,我在编码部分出现错误。

这是代码:

    package main

import (
    "encoding/gob"
    "bytes"
    "fmt"
    "encoding/json"
)

func CopyMapToAnotherMap(req map[string]interface) (cpy map[string]interface, err error) 
    var mod bytes.Buffer
    gob.Register(map[string]interface)
    enc := gob.NewEncoder(&mod)
    dec := gob.NewDecoder(&mod)

    err = enc.Encode(req)
    if err != nil 
        fmt.Println("Unable to encode map", err)
        return nil, err
    

    err = dec.Decode(&cpy)
    if err != nil 
        fmt.Println("Unable to decode map", err)
        return nil, err
    

    return cpy, nil


func main() 
    my := `"data":["aa":1,"bb":2]`
    var m map[string]interface

    err := json.Unmarshal([]byte(my), &m)
    if err !=  nil 
        fmt.Println(err)
    
    CopyMapToAnotherMap(m)

我收到一个错误:gob: type not registered for interface: []interface

如何避免这种情况?

【问题讨论】:

不要将 gob 用于此类事情。 错误包括[]interface ,但不包括map[string]interface 。你确定错误信息是正确的吗?如果是这样,那么它看起来是来自其他东西。 @Volker。你可以说得更详细点吗?您认为正确的方法是什么。我有类似的问题并为此使用编组,但互联网上充满了使用 gob 和基准的建议,表明 gob 更快并且有效。 将一张地图复制到另一张地图是通过像for k,v := range src 一样遍历源并像dst[k] = v 这样填充目标来完成的。如果您的输入和输出类型不一致,那么您必须转换键和值。这称为编程。互联网上没有很多使用 gob 的建议,因为 gob 是非常有用但也非常具体的东西。停止寻找“神奇”的解决方案。 确切地想想你想做什么,然后开始编写代码。 @Volker 总的来说你是对的,但如果你的地图有动态结构和数百行,你就会开始梦想一些魔法,而不是用无穷无尽的 if/else、强制转换和类型编写数千行代码断言。编程的这一部分(是的,我听说过这样的词)不那么令人兴奋。所以我只是想确定没有我不知道的魔法。无论如何,谢谢。 【参考方案1】:

在程序初始化时由registering the type修复:

func init() 
    gob.Register([]interface(nil))

Run an example on the playground.

【讨论】:

以上是关于gob:类型未注册接口:[]interface的主要内容,如果未能解决你的问题,请参考以下文章

gob:类型未注册接口:map[string]interface

gob 解码结构中的接口与原始接口之间的区别

gob:类型不匹配:没有匹配的字段编译解码器 - Golang

Go:将 gob 与 zmq4 一起使用

Option类型:C++(std::optional)Rust(Option)Go(gob.OptionalValue)

抽象类中嵌套接口