私の目標は、リンクされたデータ構造を持つことです。これは、別の構造体への参照を持つ構造体などです。これにより、それをファイル システムにエンコードし、必要なときにいつでもデコードして、全体を復元できます。同じ内容の連結構造。
例:
私はこれらのリンクされた構造を持っています:
type A struct {
b *B
}
type B struct {
c []C
}
type C interface{}
私はこのようにそれらを初期化します:
var c0 C = "foo"
var c1 C = "bar"
var b *B = &B{}
b.c = make([]C, 2)
b.c[0] = c0
b.c[1] = c1
var a A = A{}
a.b = b
fmt.Println(a)
// {$b_address}
fmt.Println(a.b)
// {[c0_address,c1_address]}
fmt.Println(a.b.c[0])
// foo
fmt.Println(a.b.c[1])
// bar
Aをエンコードしてファイルに永続化する方法を知りたいので、同じ結果を得るためにデコードできます。アドレスは重要ではありませんが、コンテンツは重要です。で試しましたがencoding/gob
、成功しませんでした:
// encode
f, err := os.Create("data.gob")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
enc := gob.NewEncoder(f)
enc.Encode(a)
f.Close()
// decode
var a1 A
f, err = os.Open("data.gob")
if err != nil {
fmt.Println(1, err)
os.Exit(1)
}
dec := gob.NewDecoder(f)
dec.Decode(&a1)
if err != nil {
fmt.Println(2, err)
os.Exit(1)
}
f.Close()
fmt.Println(a1)
// {<nil>}
// expected {$b_address}
完全な例: http://play.golang.org/p/2vxHR9BzNy
フィールドを公開せずにこれを行う方法はありますか? 車輪を再発明する必要がない既存の解決策はありますか?