我将创建一个或多或少形式的结构:
type FileState struct {
LastModified int64
Hash string
Path string
}
我想将这些值写入文件并在后续调用中读取它们。我最初的计划是使用键(Path)将它们读入地图并查找值(Hash和LastModified)。在Go中有这种方式吗?
如果没有,您可以推荐哪种文件格式?我在以前的项目中读过并试验过一些键/值文件存储,但没有使用Go。现在,我的要求可能相当简单,因此大型数据库服务器系统会过度。我只想要一些我可以快速,轻松,便携地阅读和阅读的内容(Windows,Mac,Linux)。因为我必须在多个平台上部署,所以我试图将我的非依赖性保持在最低限度。
我考虑过XML,CSV,JSON。我简单地看了一下Go中的gob包,发现Go包仪表板上有一个BSON包,但我不确定是否适用。
我的主要目标是快速启动和运行,这意味着我需要编写的代码量最少,并且易于部署。
答案 0 :(得分:9)
只要您的内容数据适合内存,就不会有问题。使用内存映射并定期将快照写入磁盘(例如,使用gob
包)是一个好主意。 Andrew Gerrand的Practical Go Programming讲话使用了这种技术。
如果您需要使用不同的程序访问这些文件,使用像json或csv这样的流行编码可能是个好主意。如果您只需要从Go中访问这些文件,我会使用优秀的gob包,其中包含a lot of nice features。
一旦数据变大,在每次更改时始终将整个数据库写入磁盘并不是一个好主意。此外,您的数据可能不再适合RAM。在这种情况下,您可能需要查看另一位Go开发人员Nigel Tao的leveldb键值数据库包。它目前正在积极开发(但尚未使用),但它也将提供一些高级功能,如事务和自动压缩。此外,由于leveldb设计,读/写吞吐量应该非常好。
答案 1 :(得分:1)
JSON非常简单但由于重复的变量名称而生成更大的文件。 XML没有优势。你应该使用CSV,这也很简单。您的程序将少于一页。
但事实上,这取决于你的修改。如果您进行了大量修改并且必须将它们同步存储在磁盘上,那么您可能需要一些比单个文件更复杂的东西。如果您的地图主要是只读的,或者您可以负担得起很少(不是每秒)将其转储到文件中,沿着内存映射的单个csv文件将使事情变得简单而有效。
顺便说一下,使用csv包去做。答案 2 :(得分:1)
我写了一个有序的,键值持久性库,我写的名为gkvlite -
https://github.com/steveyen/gkvlite