2013-05-24 2 views
12

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

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

ответ

21

Это прямо с Эндрю Gerrand-х 10 things you (probably) don't know about 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

Это выглядит многообещающим, но как насчет прямых вызовов 'os.Open'? присваивание переменной 'fs' будет« молча »влиять на них? – canni

+1

@canni: нет, это не повлияет на прямые вызовы. Если это то, что вы хотите, я думаю, вам нужно будет сыграть трюки в компоновщике, и я никогда не пробовал это сам. –

+5

Мне бы очень хотелось увидеть пример рабочего кода. – Paradiesstaub

0

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

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

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

6

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

Смежные вопросы