Как насмехаться/абстрагироваться от файловой системы?

Я хотел бы иметь возможность регистрировать каждую запись/чтение, чтобы проблемы с моим подключением к базовой ОС, а также (если это возможно) полностью заменить FS тем, который находится только в памяти.

Возможно ли это? Как? Может быть, есть готовое решение?

Ответ 1

Это прямо из Andrew Gerrand 10 вещей, которые вы (возможно) не знаете о Go:

var fs fileSystem = osFS{}

type fileSystem interface {
    Open(name string) (file, error)
    Stat(name string) (os.FileInfo, error)
}

type file interface {
    io.Closer
    io.Reader
    io.ReaderAt
    io.Seeker
    Stat() (os.FileInfo, error)
}

// osFS implements fileSystem using the local disk.
type osFS struct{}

func (osFS) Open(name string) (file, error)        { return os.Open(name) }
func (osFS) Stat(name string) (os.FileInfo, error) { return os.Stat(name) }

Для этого вам нужно будет написать свой код, чтобы принять аргумент fileSystem (возможно, вставить его в какой-либо другой тип или обозначить nil файловую систему по умолчанию).

Ответ 2

Для тех, кто хочет решить проблему издевательства вашей файловой системы во время тестирования, проверьте библиотеку @spf13 Afero, https://github.com/spf13/afero. Он делает все, что принимает принятый ответ, но с лучшей документацией и примерами.

Ответ 3

Просто потому, что этот вопрос всплывает довольно высоко при поиске по этому вопросу:

Я не знаю о протоколировании чтения и записи, но для файловой системы, находящейся только в памяти, я нашел blang/vfs. Я не использовал в производстве, и он говорит, что альфа и интерфейсы, вероятно, изменятся. Используйте его на свой страх и риск.

Я предполагаю, что вы можете реализовать его для чтения и записи журналов.