fs.WalkDir 的第一个参数,不一定是 os.DirFS
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,不用真的在磁盘上建目录:
mfs := fstest.MapFS{
"logs/app.log": {Data: []byte("hello")},
"logs/nginx/a.log": {Data: []byte("x")},
}