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

使用 gob 打包递归定义的结构体

使用 gob 打包递归定义的结构体

Go
慕桂英546537 2021-08-30 14:55:51
我主要使用 Python,但正在玩 Go。我写了以下内容来做一些在 python 中非常简单的事情,我希望它也可以在 Go 中完成。package mainimport (    "bytes"    "encoding/gob"    "fmt"    "io/ioutil")type Order struct {    Text string    User *User}type User struct {    Text  string    Order *Order}func main() {    o := Order{}    u := User{}    o.Text = "order text"    u.Text = "user text"    // commenting this section prevents stack overflow    o.User = &u    u.Order = &o    fmt.Println("o.u.text:", o.User.Text, "u.o.text:", u.Order.Text)    // end section    m := new(bytes.Buffer)    enc := gob.NewEncoder(m)    enc.Encode(o)    err := ioutil.WriteFile("gob_data", m.Bytes(), 0600)    if err != nil {        panic(err)    }    fmt.Printf("just saved gob with %v\n", o)    n, err := ioutil.ReadFile("gob_data")    if err != nil {        fmt.Printf("cannot read file")        panic(err)    }    p := bytes.NewBuffer(n)    dec := gob.NewDecoder(p)    e := Order{}    err = dec.Decode(&e)    if err != nil {        fmt.Printf("cannot decode")        panic(err)    }    fmt.Printf("just read gob from file and it's showing: %v\n", e)}如您所见,有两个自定义结构,每个都包含对另一个的引用,递归地。当我尝试使用 gob 将一个文件打包成一个文件时,它会编译,但出现堆栈溢出,我假设这是由递归引起的。根据我的经验,pickle 可以毫不费力地处理这样的事情。我究竟做错了什么?
查看完整描述

1 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

截至目前,该encoding/gob不适用于递归值:

递归类型工作正常,但递归值(带循环的数据)有问题。这可能会改变。

在更改之前,您必须要么不使用循环数据,要么使用不同的序列化方法。


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

添加回答

举报

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