36

我希望能够将我的 go 应用程序发出的每次写入/读取记录到底层操作系统,并且(如果可能的话)完全用仅驻留在内存中的 FS 替换 FS。

可能吗?如何?也许有一个现成的解决方案?

4

4 回答 4

44

这直接来自 Andrew Gerrand 的关于 Go 的 10 件你(可能)不知道的事情:

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表示默认文件系统)。

于 2013-05-24T19:43:54.187 回答
31

对于那些希望在测试期间解决模拟文件系统问题的人,请查看 @spf13 的 Afero 库,https://github.com/spf13/afero。它完成了公认答案所做的一切,但具有更好的文档和示例。

于 2016-06-24T16:32:52.040 回答
10

您可以使用该testing/fstest软件包:

package main
import "testing/fstest"

func main() {
   fs := fstest.MapFS{
      "hello.txt": {
         Data: []byte("hello, world"),
      },
   }
   data, err := fs.ReadFile("hello.txt")
   if err != nil {
      panic(err)
   }
   println(string(data) == "hello, world")
}

https://godocs.io/testing/fstest

于 2021-04-08T21:44:05.340 回答
1

仅仅因为在谷歌上搜索这个问题时这个问题弹出的频率很高:

我不知道记录读取和写入,但是对于仅驻留在内存中的文件系统,我发现了blang/vfs。我没有在生产中使用过,它说它是 alpha 版,接口可能会改变。需要您自担风险使用它。

我想你可以实现它来记录读取和写入。

于 2016-02-12T13:30:43.430 回答