猿问

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

我和我的团队是 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)

}

有没有更好的方法来做到这一点?如果我们不需要更新标题,那能解决我们的问题吗?(始终编码到文件末尾,而不是尝试在添加记录之间的开头更新某些内容)。理想情况下,我们稍后可能需要一个标题,所以如果我们能保留它,那就太好了。


提前致谢!


杨魅力
浏览 252回答 1
1回答

茅侃侃

您的文件会因为更新时标题的长度发生变化而变得混乱。这就是为什么某些格式为头保留文件的最后 N 个字节的原因。以你的方式,你将不得不读取内存中的整个文件更新标题将标题 + 记录重写回文件或者在文件开头为标题分配一个固定大小,并且只更新它的那部分。请记住,这对于任何编程语言都是一个问题,而不仅仅是 Go。
随时随地看视频慕课网APP

相关分类

Go
我要回答