我主要使用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将一个文件打包到一个文件中时,它会编译,但是出现堆栈溢出,我认为这是由递归引起的。以我的经验,泡菜会像处理抽水一样轻松。我究竟做错了什么?
到目前为止,该encoding/gob程序包不适用于递归值:
encoding/gob
递归类型可以正常工作,但是递归值(带有循环的数据)存在问题。这可能会改变。
在此更改之前,您将要么不使用循环数据,要么使用其他方法进行序列化。