3 回答
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 不知道如何将事物映射回其适当的类型。
TA贡献1735条经验 获得超5个赞
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)
}
- 3 回答
- 0 关注
- 997 浏览
添加回答
举报