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

在 Go 中将多个结构写入文件

在 Go 中将多个结构写入文件

Go
杨魅力 2021-08-23 17:04:01
我和我的团队是 Go 的新手,我们有一个“标题”结构和多个“记录”结构,我们正试图将它们写入文件。然而,每当我们尝试通过重写来更新文件中的 Header 结构时,文件的其余部分就会被弄乱。我们正在使用编码/解码:(dataFile 是从 os.Open 返回的)dataFile.Seek(header.FreePtr,0) //seek to free space - could we just refactor and seek to end of file? encoder := gob.NewEncoder((dataFile))err = encoder.Encode(record)if err != nil {    panic(err)}dataFile.Seek(header.FreePtr, 0)decoder = gob.NewDecoder(dataFile)r := Record{}err = decoder.Decode(&r)fmt.Println(r.Key)fmt.Println(r.Width)fmt.Println(string(r.Data))header.FreePtr += int64(unsafe.Sizeof(record.Key)) + int64(unsafe.Sizeof(record.Width))+ int64(record.Width)dataFile.Seek(0, 0)encoder = gob.NewEncoder(dataFile)err = encoder.Encode(header)if err != nil {    panic(err)}有没有更好的方法来做到这一点?如果我们不需要更新标题,那能解决我们的问题吗?(始终编码到文件末尾,而不是尝试在添加记录之间的开头更新某些内容)。理想情况下,我们稍后可能需要一个标题,所以如果我们能保留它,那就太好了。提前致谢!
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

您的文件会因为更新时标题的长度发生变化而变得混乱。这就是为什么某些格式为头保留文件的最后 N 个字节的原因。以你的方式,你将不得不

  1. 读取内存中的整个文件

  2. 更新标题

  3. 将标题 + 记录重写回文件

或者在文件开头为标题分配一个固定大小,并且只更新它的那部分。

请记住,这对于任何编程语言都是一个问题,而不仅仅是 Go。


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

添加回答

举报

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