【问题标题】:How to I manage state inside a file in Go?如何在 Go 中管理文件中的状态?
【发布时间】:2018-08-26 10:05:31
【问题描述】:

很难承认,但我很难在我的 cli go 应用中管理状态。我基本上想要的是在磁盘上的文件中管理具有属性的对象列表。我希望能够添加对象及其属性、更新对象和/或其属性并在需要时将其删除。

我认为只有一个 yml 或 json 文件并使用某种库对其进行编辑会很容易,但对于像我这样的 Go 初学者来说,这似乎比它应该的要难。

一个例子是下面的 json 结构。

{
  "servers":
    [
      { "hostname": "gandalf", "ip": "192.168.1.10", "color": "red" },
      { "hostname": "bilbo", "ip": "192.168.1.11", "color": "blue" },
      { "hostname": "frodo", "ip": "192.168.1.12", "color": "yellow" }
    ]
}

现在我希望能够添加、删除和编辑服务器。不一定非要json,yaml也可以。

你们对如何做到这一点有任何建议(库和示例)吗?我已经尝试过Viper,但添加新对象甚至编辑现有对象似乎是不可能的。

【问题讨论】:

  • 为什么不直接打开文件并将内容解组为json?您只需将文件句柄(因为它实现了io.Reader 接口)传递给json.NewDecoder(),然后将指向与文件结构匹配的结构的指针传递给Decode()

标签: json go yaml configuration-files


【解决方案1】:

对于需要人类可读且主要由人类编辑的设置,yamljson 文件似乎很好。

如果状态是由程序本身写入和读取的,并且一个完整的数据库似乎有点矫枉过正,那么我会使用基于文件的数据库。如果数据需要更多结构,可能是一个简单的键/值存储,如 boltdbsqlite

我个人在这种情况下使用boltdb,因为它非常轻量级、超快并且我喜欢它的简单性。

-- 编辑--

使用json 作为文件结构,问题是您每次都需要写入和读取整个文件。编辑将是读取整个文件、解组 json、更改解组对象中的某些内容、将其编组回 json 并再次写入整个文件。

这就是为什么我只将它用于程序在启动时读取一次的设置,仅此而已。

【讨论】:

  • 我开始研究 boltdb 并放弃了这个想法,因为我需要的不仅仅是简单的键/值结构。现在我再次查看,几乎可以将任何结构存储到 boltdb 中。此外,似乎还有一个很棒的工具包@@github.com/asdine/storm
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 2011-02-08
  • 2020-06-16
  • 1970-01-01
  • 2021-12-28
  • 2016-08-10
  • 1970-01-01
  • 2017-04-20
相关资源
最近更新 更多