如何使用filepath.Glob()按扩展名递归获取所有文件?
在Go中匹配所有层级指定扩展名的模板文件
Go 的 filepath.Glob(以及 template.ParseFS 依赖的文件匹配逻辑)对通配符的处理和 Node.js 存在差异,核心区别在于 ** 的生效规则:
*仅匹配当前目录下的任意非空文件名(不会穿透子目录)**必须作为独立的路径段(被/包裹或位于路径首尾),才能匹配任意数量的子目录,但它不会匹配当前目录下的文件
所以你用 **/*.gohtml 只能匹配到子目录中的 .gohtml 文件,根目录下的文件会被遗漏。要覆盖所有层级的文件,需要同时指定两个匹配模式:
package main import ( "embed" "html/template" "io/fs" ) //go:embed templates var templates embed.FS func main() { folder, err := fs.Sub(templates, "templates") if err != nil { panic(err) // 实际代码中请合理处理错误 } // 同时匹配根目录和所有子目录下的.gohtml文件 tpl, err := template.ParseFS(folder, "*.gohtml", "**/*.gohtml") if err != nil { panic(err) } // ...后续逻辑 }
关键规则说明
*.gohtml:匹配当前目录(即templates根目录)下所有.gohtml文件**/*.gohtml:匹配templates目录下任意层级子目录中的.gohtml文件
组合这两个模式就能覆盖所有符合条件的文件,无需手动枚举每个子目录路径。
内容的提问来源于stack exchange,提问作者David Alsh
相关产品推荐
相关产品推荐

