如何在Go中持久化或编码链接数据结构?

时间:2015-09-23 16:09:48

标签: encoding go gob

我的目标是建立一个链接数据结构,这是一个带有对另一个结构的引用的结构,依此类推,所以我可以将它编码到我的文件系统中,每当我需要它时,解码它,所以我恢复整个链接结构,具有相同的内容。

示例:

我有这些链接结构:

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

有没有办法做到这一点而不公开字段?有没有现成的解决方案,所以我不需要重新发明轮子?

2 个答案:

答案 0 :(得分:2)

  

有没有办法在不将字段公开的情况下执行此操作?有没有现成的解决方案,所以我不需要重新发明轮子?

除非您愿意通过在编码时将所有数据复制到包含导出字段的类型并且在解码时将它们复制到其中来做到这一点,否则编号

如果数据未导出,则的其他软件包无法看到它。这就是为什么它们被称为未导出的原因。 encoding/jsonencoding/xmlencoding/gob等软件包仅出于这个原因对导出的数据进行操作。

答案 1 :(得分:0)

必须导出字段。执行编码/序列化等的包无法以其他方式查看字段。只要您的字段被导出,任何{{1}}包都可以默认执行您想要的操作。