如何使用未导出的指针gob编码struct?

时间:2018-03-09 20:53:17

标签: go

我有一个结构,我可以成功地进行gob编码和解码,如下所示:

type Node struct {
    Value int
    Next  *Node
}

myNode := Node{
    Value: 1,
    Next: &Node{
        Value: 2,
    },
}
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
dec := gob.NewDecoder(&buf)
if err := enc.Encode(&myNode); err != nil {
    panic(err)
}
var decodedNode Node
if err := dec.Decode(&decodedNode); err != nil {
    panic(err)
}

我现在要隐藏Node

的字段
type Node struct {
    value int
    next  *Node
}

由于不再导出字段,我现在必须编写自定义GobEncodeGobDecode函数:

func (d *Node) GobEncode() ([]byte, error) {
    var buf bytes.Buffer
    encoder := gob.NewEncoder(&buf)
    if err := encoder.Encode(d.value); err != nil {
        return nil, err
    }
    if err := encoder.Encode(d.next); err != nil {
        return nil, err
    }
    return buf.Bytes(), nil
}

func (d *Node) GobDecode(b []byte) error {
    buf := bytes.NewBuffer(b)
    decoder := gob.NewDecoder(buf)
    if err := decoder.Decode(&d.value); err != nil {
        return err
    }
    if err := decoder.Decode(&d.next); err != nil {
        return err
    }
    return nil
}

由于Node.next

中的零值,这不起作用
panic: gob: cannot encode nil pointer of type *main.Node [recovered]
    panic: gob: cannot encode nil pointer of type *main.Node [recovered]
    panic: gob: cannot encode nil pointer of type *main.Node

我在我的自定义函数中重用了gob.NewEncoder,因为我试图尽可能多地重用encode package

有任何关于让这项工作的建议吗?

0 个答案:

没有答案
相关问题