我正在尝试实现一个基于接口的消息队列,其中作业被作为字节推送到redis队列。但在尝试解码字节流时,我一直收到EOF错误。
https://play.golang.org/p/l9TBvcn9qg
有人能给我指个方向吗?
谢谢!
发布于 2015-10-12 13:19:43
在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"}}
// ...
}发布于 2015-10-12 14:47:16
从上面的Mark那里找到了问题的答案。我忘了做gob.Register(B{})了
https://stackoverflow.com/questions/33073434
复制相似问题