gob.Register方法的目的

6 go gob

我已经阅读了(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()有人可以解释我何时使用它以及为什么?

Not*_*fer 9

如果你只处理具体的类型(结构),你真的不需要它.处理接口后,必须首先注册具体类型.

例如,假设我们有这些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不知道如何将事物映射回适当的类型.


yee*_*yee 1

正如http://golang.org/pkg/encoding/gob/#Register所说:

仅需要注册将作为接口值的实现进行传输的类型。

所以你的演示不需要它。