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

我的目标是拥有一个链接的数据结构,这是一个引用另一个结构的结构,等等,这样我就可以将它编码到我的文件系统中,并且只要我需要它,就对其进行解码,这样我就可以恢复整个链接结构,内容相同。


例子:


我有这些链接结构:


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


有没有办法在不公开字段的情况下做到这一点?是否有任何现有的解决方案,所以我不需要重新发明轮子?


慕盖茨4494581
浏览 165回答 1
1回答

白板的微信

有没有办法在不公开字段的情况下做到这一点?是否有任何现有的解决方案,所以我不需要重新发明轮子?除非您愿意通过在编码时将所有数据复制到具有导出字段的类型中并在解码时将它们复制到类型中来做到这一点,否则不。如果数据未导出,其他包就看不到它。这就是为什么它们被称为未出口的。出于这个确切原因,像encoding/json、encoding/xml和 之类的包encoding/gob仅对导出的数据进行操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go