为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕盖茨4494581 2021-11-08 18:16:04
我的目标是拥有一个链接的数据结构,这是一个引用另一个结构的结构,等等,这样我就可以将它编码到我的文件系统中,并且只要我需要它,就对其进行解码,这样我就可以恢复整个链接结构,内容相同。例子:我有这些链接结构: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] = c0b.c[1] = c1var a A = A{}a.b = bfmt.Println(a)// {$b_address}fmt.Println(a.b)// {[c0_address,c1_address]}fmt.Println(a.b.c[0])// foofmt.Println(a.b.c[1])// bar我想知道如何对 A 进行编码,将它保存到一个文件中,这样我就可以对其进行解码,得到相同的结果。地址不重要,重要的是内容。我已经尝试过,但encoding/gob没有成功:// encodef, err := os.Create("data.gob")if err != nil {    fmt.Println(err)    os.Exit(1)}enc := gob.NewEncoder(f)enc.Encode(a)f.Close()// decodevar a1 Af, 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有没有办法在不公开字段的情况下做到这一点?是否有任何现有的解决方案,所以我不需要重新发明轮子?
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

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

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

如果数据未导出,其他包就看不到它。这就是为什么它们被称为未出口的。出于这个确切原因,像encoding/jsonencoding/xml和 之类的包encoding/gob仅对导出的数据进行操作。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信