猿问

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

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


当年话下
浏览 998回答 3
3回答

牧羊人nacy

如果您仅处理具体类型(结构),则您实际上并不需要它。一旦你处理接口,你必须首先注册你的具体类型。例如,假设我们有这些结构体和接口(结构体实现了接口):type Getter interface {    Get() string}type Foo struct {    Bar string}func (f Foo)Get() string {    return f.Bar}要将Fooover gob 作为 a发送Getter并解码回来,我们必须首先调用gob.Register(Foo{})所以流程是:// init and registerbuf := bytes.NewBuffer(nil)gob.Register(Foo{})    // create a getter of Foog := Getter(Foo{"wazzup"})// encodeenc := gob.NewEncoder(buf)enc.Encode(&g)// decodedec := gob.NewDecoder(buf)var gg Getterif err := dec.Decode(&gg); err != nil {    panic(err)}现在尝试删除Register,这将不起作用,因为 gob 不知道如何将事物映射回其适当的类型。

喵喔喔

正如http://golang.org/pkg/encoding/gob/#Register所说:只需要注册将作为接口值的实现传输的类型。所以你的演示不需要它。

慕村225694

如果你想对一个map[string]interface{}进行编码/解码,由于map的字段是作为interface type括起来的,那么我们需要先注册具体的类型。package mainimport (    "bytes"    "encoding/gob"    "fmt"    "log")type SomeStruct struct {    Text string}func main() {    var bytes bytes.Buffer    // Remove one of these, then the decoding will produce error    gob.Register(SomeStruct{})    gob.Register([]interface{}{})    gob.Register([]SomeStruct{})    gob.Register(map[string]SomeStruct{})    writer := gob.NewEncoder(&bytes)    err := writer.Encode(map[string]interface{}{        "SomeStruct": SomeStruct{"Halo"},        "SomeSlice":  []interface{}{},        "SomeSliceStruct": []SomeStruct{            {                Text: "SomeText",            },        },        "SomeMapStruct": map[string]SomeStruct{            "S": {"Test"},        },    })    if err != nil {        log.Fatalf("Error on encode process: %v\n", err)        return    }    reader := gob.NewDecoder(&bytes)    var aMap map[string]interface{}    err = reader.Decode(&aMap)    if err != nil {        log.Fatalf("Error on decode process: %v\n", err)        return    }    fmt.Printf("Decode is successful: %+v\n", aMap)}
随时随地看视频慕课网APP

相关分类

Go
我要回答