为了账号安全,请及时绑定邮箱和手机立即绑定

Gob 解码器返回 EOF 错误

Gob 解码器返回 EOF 错误

Go
炎炎设计 2021-11-15 15:59:16
我正在尝试实现一个基于接口的消息队列,其中作业作为字节推送到 redis 队列。但是在尝试解码字节流时,我不断收到 EOF 错误。https://play.golang.org/p/l9TBvcn9qg有人能指出我正确的方向吗?
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

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

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


查看完整回答
反对 回复 2021-11-15
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

在您的 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"}}

   // ...

}


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 279 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信