0

私の目標は、リンクされたデータ構造を持つことです。これは、別の構造体への参照を持つ構造体などです。これにより、それをファイル システムにエンコードし、必要なときにいつでもデコードして、全体を復元できます。同じ内容の連結構造。

例:

私はこれらのリンクされた構造を持っています:

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

フィールドを公開せずにこれを行う方法はありますか? 車輪を再発明する必要がない既存の解決策はありますか?

4

2 に答える 2

2

フィールドを公開せずにこれを行う方法はありますか? 車輪を再発明する必要がない既存の解決策はありますか?

エンコード時にエクスポートされたフィールドを使用してすべてのデータを型にコピーし、デコード時にそれらからすべてのデータをコピーすることでこれを行う場合を除き、いいえ。

データがエクスポートされていない場合、他のパッケージはそれを見ることができません。そのため、非輸出品と呼ばれています。encoding/jsonencoding/xml、および などのパッケージは、まさにencoding/gobこの理由から、エクスポートされたデータに対してのみ動作します。

于 2015-09-23T16:29:54.467 に答える
0

フィールドをエクスポートする必要があります。エンコーディング/シリアライゼーションなどを行うパッケージには、それ以外の方法でフィールドを確認する方法がありません。フィールドがエクスポートされている限り、どのencoding/パッケージもデフォルトで必要なことを行います。

于 2015-09-23T20:08:43.003 に答える