ジョブがバイトとして redis キューにプッシュされるインターフェイス ベースのメッセージ キューを実装しようとしています。しかし、バイト ストリームをデコードしようとすると、EOF エラーが発生し続けます。
https://play.golang.org/p/l9TBvcn9qg
誰かが私を正しい方向に向けることができますか?
ありがとうございました!
ジョブがバイトとして redis キューにプッシュされるインターフェイス ベースのメッセージ キューを実装しようとしています。しかし、バイト ストリームをデコードしようとすると、EOF エラーが発生し続けます。
https://play.golang.org/p/l9TBvcn9qg
誰かが私を正しい方向に向けることができますか?
ありがとうございました!
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"}}
// ...
}