Go

fs.WalkDir 的第一个参数,不一定是 os.DirFS

go
fs.WalkDir(os.DirFS(root), ".", func(path string, d fs.DirEntry, err error) error {
	// ...
})

第一个参数的类型是 fs.FS,一个抽象的文件系统。os.DirFS 只是把磁盘目录包装成 FS,换成别的也行:

  • embed.FS:编译进二进制的文件
  • fstest.MapFS:测试用的内存文件系统
  • zip 包等

第二个参数才是这个 FS 里的起点,常写 "."。

回调里的 fs.DirEntry 是当前条目的轻量信息:Name()、IsDir()、Type() 都不用再 Stat。要大小、修改时间时才调 d.Info()。注意 err != nil 时 d 可能是 nil。

写测试时用 MapFS,不用真的在磁盘上建目录:

go
mfs := fstest.MapFS{
	"logs/app.log":     {Data: []byte("hello")},
	"logs/nginx/a.log": {Data: []byte("x")},
}
esc