首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gob解码器返回EOF错误

Gob解码器返回EOF错误
EN

Stack Overflow用户
提问于 2015-10-12 12:45:26
回答 2查看 4.4K关注 0票数 1

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

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

有人能给我指个方向吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-10-12 13:19:43

在Go Playground示例中,您正在尝试编码一个接口,而接口没有具体的实现。如果您从A结构中删除该接口,则应该可以工作。如下所示:

代码语言:javascript
复制
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结构。要进一步清理,请执行以下操作:

代码语言:javascript
复制
type A struct{
  Name string
  Interface B // no longer a pointer
}

func main() {
   // ...
   test := &A{Name: "wut", Interface: B{Value: "BVALUE"}}
   // ...
}
票数 0
EN

Stack Overflow用户

发布于 2015-10-12 14:47:16

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33073434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档