3

私は主に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)

}

ご覧のとおり、2 つのカスタム構造体があり、それぞれが相互の参照を再帰的に含んでいます。gob を使用してファイルにパッケージ化しようとすると、コンパイルされますが、スタック オーバーフローが発生します。これは再帰が原因であると想定しています。私の経験では、pickle はこのようなことをあえぎなく処理します。私は何を間違っていますか?

4

1 に答える 1

6

今のところ、encoding/gobパッケージは再帰的な値では動作しません:

再帰型は正常に機能しますが、再帰値 (循環のあるデータ) には問題があります。これは変更される可能性があります。

これが変更されるまでは、循環データを使用しないか、シリアル化に別のアプローチを使用する必要があります。

于 2014-11-12T14:34:36.060 に答える