猿问

Gob 解码器返回 EOF 错误

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

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

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


炎炎设计
浏览 280回答 2
2回答

慕少森

从上面的马克找到了问题的答案。我忘了做一个gob.Register(B{})https://play.golang.org/p/7rQDHvMhD7

料青山看我应如是

在您的 Go Playground 示例中,您尝试对接口进行编码,而接口没有具体的实现。如果您从A结构中删除接口,那应该可以。像下面这样:package mainimport "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"}}   // ...}
随时随地看视频慕课网APP

相关分类

Go
我要回答