Сохранить ключ карты/значения в постоянном файле

Я буду создавать структуру более или менее формы:

type FileState struct {
    LastModified int64
    Hash string
    Path string
}

Я хочу записать эти значения в файл и прочитать их при последующих вызовах. Мой первоначальный план состоит в том, чтобы прочитать их в карте и значениях поиска (Hash и LastModified) с помощью ключа (Путь). Есть ли способ сделать это в Go?

Если нет, какой формат файла вы можете порекомендовать? Я прочитал и экспериментировал с некоторыми хранилищами файлов ключей/значений в предыдущих проектах, но не использовал Go. В настоящее время мои требования, вероятно, довольно просты, поэтому большая система серверов баз данных будет излишней. Я просто хочу, чтобы я мог писать и читать быстро, легко и портативно (Windows, Mac, Linux). Поскольку я должен развертывать на нескольких платформах, я стараюсь, чтобы мои не-go-зависимости были минимальными.

Я рассмотрел XML, CSV, JSON. Я кратко рассмотрел пакет gob в Go и заметил пакет BSON на панели управления Go, но я не уверен, что они применяются.

Моя основная цель здесь - быстро встать и работать, а это означает, что для меня требуется меньше всего кода, а также простота развертывания.

Ответ 1

Пока ваши данные entiere вписываются в память, у вас не должно быть проблем. Хорошая идея - использовать карту памяти и регулярно записывать снимки на диск (например, с помощью пакета gob). Практическое программирование Go говорит Эндрю Герранд, используя эту технику.

Если вам нужно получить доступ к этим файлам с разными программами, использование популярной кодировки типа json или csv, вероятно, является хорошей идеей. Если вам просто нужно получить доступ к этому файлу из Go, я бы использовал отличный пакет gob, у которого было много приятных функций.

Как только ваши данные станут больше, не всегда нужно писать всю базу данных на диск при каждом изменении. Кроме того, ваши данные могут больше не вписываться в ОЗУ. В этом случае вы можете взглянуть на пакет базы данных leveldb от Найджела Тао, другого разработчика Go. В настоящее время он активно развивается (но еще не используется), но он также предлагает некоторые дополнительные функции, такие как транзакции и автоматическое сжатие. Кроме того, пропускная способность чтения/записи должна быть неплохой из-за дизайна leveldb.

Ответ 2

JSON очень прост, но делает большие файлы из-за повторяющихся имен переменных. XML не имеет преимуществ. Вы должны пойти с CSV, что тоже очень просто. Ваша программа сделает менее одной страницы.

Но это зависит от ваших модификаций. Если вы внесете много изменений и должны их синхронизировать на диске, вам может понадобиться нечто более сложное, чем один файл. Если ваша карта в основном доступна только для чтения, или если вы можете позволить себе сбрасывать ее по файлу редко (не каждую секунду), один файл csv по карте памяти будет держать вещи простыми и эффективными.

Кстати, используйте пакет csv для этого.

Ответ 3

Там есть упорядоченная библиотека сохранения значений ключевого значения для go, которую я написал, называется gkvlite -
https://github.com/steveyen/gkvlite