为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2021-11-08 16:48:33
我已阅读 (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()有人可以向我解释什么时候使用它,为什么?
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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


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


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 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 不知道如何将事物映射回其适当的类型。


查看完整回答
反对 回复 2021-11-08
?
喵喔喔

TA贡献1735条经验 获得超5个赞

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

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

所以你的演示不需要它。


查看完整回答
反对 回复 2021-11-08
?
慕村225694

TA贡献1880条经验 获得超4个赞

如果你想对一个map[string]interface{}进行编码/解码,由于map的字段是作为interface type括起来的,那么我们需要先注册具体的类型。



package main


import (

    "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)

}


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 997 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信