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

我主要使用 Python,但正在玩 Go。我写了以下内容来做一些在 python 中非常简单的事情,我希望它也可以在 Go 中完成。


package main


import (

    "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 可以毫不费力地处理这样的事情。我究竟做错了什么?


慕桂英546537
浏览 148回答 1
1回答

慕沐林林

截至目前,该encoding/gob包不适用于递归值:递归类型工作正常,但递归值(带循环的数据)有问题。这可能会改变。在更改之前,您必须要么不使用循环数据,要么使用不同的序列化方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go