You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)
	}
	// ...后续逻辑
}

关键规则说明

  1. *.gohtml:匹配当前目录(即 templates 根目录)下所有 .gohtml 文件
  2. **/*.gohtml:匹配 templates 目录下任意层级子目录中的 .gohtml 文件

组合这两个模式就能覆盖所有符合条件的文件,无需手动枚举每个子目录路径。

内容的提问来源于stack exchange,提问作者David Alsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:35:30