2013-05-24 10 views
12

Chciałbym móc rejestrować każdy zapis/odczytać, że moje problemy z aplikacją idą do bazowego systemu operacyjnego, a także (jeśli to możliwe) całkowicie zastąpić FS tym, który znajduje się tylko w pamięci.Jak pozorować/abstrakcyjny system plików w trybie go?

Czy to możliwe? W jaki sposób? Może istnieje gotowe rozwiązanie?

Odpowiedz

21

Jest to prosto z Andrew Gerrand na 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) } 

Aby to działało, trzeba będzie napisać kod do podjęcia fileSystem argumentu (może umieścić go w jakimś innym rodzaju, albo niech nil Oznaczmy domyślny system plików).

+2

To wygląda obiecująco, ale co z bezpośrednimi połączeniami z 'os.Open'? Czy przypisanie zmiennej 'fs' wpłynie na nią" po cichu "? – canni

+1

@canni: nie, nie wpłynie to na połączenia bezpośrednie. Jeśli tego chcesz, myślę, że będziesz musiał grać sztuczki na linkerze i nigdy tego nie próbowałem. –

+5

Chciałbym zobaczyć przykład działającego kodu. – Paradiesstaub

0

Tylko dlatego kwestia ta pojawia się dość wysokie, gdy googlowania dla tej sprawy:

nie wiem o rejestrowanie odczytuje i zapisuje, ale dla systemu plików miejsce zamieszkania tylko w pamięci, Znalazłem blang/vfs. Nie używałem go w produkcji i mówi się, że to alfa, a interfejsy prawdopodobnie się zmienią. Używaj go na własne ryzyko.

Przypuszczam, że można go zaimplementować do rejestrowania odczytów i zapisów.

6

Dla osób, które chcą rozwiązać problem kpienia z systemu plików podczas testowania, biblioteka Afero biblioteki check spf13, https://github.com/spf13/afero. Robi wszystko, co robi zaakceptowana odpowiedź, ale dzięki lepszej dokumentacji i przykładom.