【问题标题】:Gob Decoder Returning EOF ErrorGob 解码器返回 EOF 错误
【发布时间】:2016-01-09 11:28:41
【问题描述】:

我正在尝试实现一个基于接口的消息队列,其中作业作为字节推送到 redis 队列。但是在尝试解码字节流时,我不断收到 EOF 错误。

https://play.golang.org/p/l9TBvcn9qg

有人能指出我正确的方向吗?

谢谢!

【问题讨论】:

  • enc.Encode(test) 函数返回一个错误,捕获并检查所有可能的错误是个好习惯
  • 感谢您的提醒。我通常会捕获并处理错误,但在这种情况下,我只是想演示编码和解码嵌套接口的问题。
  • 对不起,我的意思是调用返回一个错误,并且在运行代码并捕获错误时,它显示“gob: type not registered for interface: main.B”。在编码之前添加 gob.Register(B{}) 可以防止 EOF。
  • 我完全忘记了必须注册!谢谢马克!我会注意检查错误。”
  • 问题和答案应该包含所有相关代码,而不是依赖第三方网站(Go 游乐场链接很好,但它们不应该是理解问题的唯一方法)。跨度>

标签: go gob


【解决方案1】:

从上面的 Mark 中找到问题的答案。我忘了做一个gob.Register(B{})

https://play.golang.org/p/7rQDHvMhD7

【讨论】:

    【解决方案2】:

    在您的 Go Playground 示例中,您尝试对接口进行编码,而接口没有具体的实现。如果您从 A 结构中删除接口,那应该可以工作。像下面这样:

    package main
    
    import "fmt"
    import "encoding/gob"
    import "bytes"
    
    type testInterface interface{}
    
    type A struct {
      Name string
      Interface *B // note this change here
    }
    
    type B struct {
      Value string
    }
    
    func main() {
      var err error
      test := &A {
        Name: "wut",
        Interface: &B{Value: "BVALUE"},
      }
      buf := bytes.NewBuffer([]byte{})
      enc := gob.NewEncoder(buf)
      dec := gob.NewDecoder(buf)
    
      // added error checking as per Mark's comment
      err = enc.Encode(test)
      if err != nil {
        panic(err.Error())
      }
    
      result := &A{}
      err := dec.Decode(result)
      fmt.Printf("%+v\n", result)
      fmt.Println("Error is:", err)
      fmt.Println("Hello, playground")
    }
    

    此外,作为旁注,您将看到如下某种输出:&{Name:wut Interface:0x1040a5a0} 因为A 引用了对B 结构的引用。进一步清理:

    type A struct{
      Name string
      Interface B // no longer a pointer
    }
    
    func main() {
       // ...
       test := &A{Name: "wut", Interface: B{Value: "BVALUE"}}
       // ...
    }
    

    【讨论】:

    • 我正在使用接口来抽象作业队列,这样我就不必每次都将 case assert 切换到特定的结构类型。 (除了B之外还有很多struct实现了testInterface)这是否意味着我没有办法将子字段抽象成接口?
    • 太棒了!很高兴知道。我自己没有亲自使用过gob 包。我使用过其他 encoding 包,所以我认为它是相同的行为。
    猜你喜欢
    • 2016-10-24
    • 2019-08-07
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多