gpt4 book ai didi

go - gob.Register 方法的目的是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:19:05 26 4
gpt4 key购买 nike

我已经阅读了 ( 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)
}

但是我不知道这个方法gob.Register() 的目的,谁能告诉我什么时候使用它,为什么要使用它?

最佳答案

如果您只处理具体类型(结构),您实际上并不需要它。一旦你处理了接口(interface),你必须首先注册你的具体类型。

例如,假设我们有这些结构和接口(interface)(结构实现了接口(interface)):

type Getter interface {
Get() string
}


type Foo struct {
Bar string
}

func (f Foo)Get() string {
return f.Bar
}

要通过 gob 作为 Getter 发送一个 Foo 并将其解码回来,我们必须首先调用

gob.Register(Foo{})

所以流程是:

// 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)
}

现在尝试删除 Register 但这不会起作用,因为 gob 不知道如何将事物映射回它们适当的类型。

关于go - gob.Register 方法的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com