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:类型不匹配:没有匹配的字段编译解码器 - Golang
Option类型:C++(std::optional)Rust(Option)Go(gob.OptionalValue)