我已经阅读了(gob)的文档,我遇到了一些问题:
现在我知道如何对结构和解码进行编码:
func main() {
s1 := &S{
Field1: "Hello Gob",
Field2: 999,
}
log.Println("Original value:", s1)
buf := new(bytes.Buffer)
err := gob.NewEncoder(buf).Encode(s1)
if err != nil {
log.Println("Encode:", err)
return
}
s2 := &S{}
err = gob.NewDecoder(buf).Decode(s2)
if err != nil {
log.Println("Decode:", err)
return
}
log.Println("Decoded value:", s2)
Run Code Online (Sandbox Code Playgroud)
}
但我不知道这种方法的目的是否gob.Register()有人可以解释我何时使用它以及为什么?
如果你只处理具体的类型(结构),你真的不需要它.处理接口后,必须首先注册具体类型.
例如,假设我们有这些struct和interface(struct实现了接口):
type Getter interface {
Get() string
}
type Foo struct {
Bar string
}
func (f Foo)Get() string {
return f.Bar
}
Run Code Online (Sandbox Code Playgroud)
要发送一个Fooover gob并将其Getter解码回来,我们必须先打电话
gob.Register(Foo{})
Run Code Online (Sandbox Code Playgroud)
所以流程将是:
// init and register
buf := bytes.NewBuffer(nil)
gob.Register(Foo{})
// create a getter of Foo
g := Getter(Foo{"wazzup"})
// encode
enc := gob.NewEncoder(buf)
enc.Encode(&g)
// decode
dec := gob.NewDecoder(buf)
var gg Getter
if err := dec.Decode(&gg); err != nil {
panic(err)
}
Run Code Online (Sandbox Code Playgroud)
现在尝试删除它Register,这将无法工作,因为gob不知道如何将事物映射回适当的类型.