使用template.ParseFS解析embed.FS模板报错,求解决方法
Go模板解析:解决
template: pattern matches no files: **/*.html错误 核心问题分析
你遇到的错误是因为embed语句的路径模式和ParseFS的匹配模式不匹配:
- 用
//go:embed internal/web/views/*嵌入时,文件在FS中的路径是无目录前缀的直接文件名(如index.html),而非带完整目录的路径; - 而
**/*.html是递归匹配带子目录的路径,自然匹配不到嵌入的文件。
两种可行解决方案
方案1:调整embed语句以包含完整目录结构
如果需要保留**/*.html的递归匹配模式,修改embed语句为包含目录本身,这样嵌入的文件会保留完整路径前缀:
//go:embed internal/web/views var viewsFS embed.FS
然后调用ParseFS时使用完整的匹配路径:
tmpl, err := template.ParseFS(viewsFS, "internal/web/views/**/*.html")
方案2:修改ParseFS的匹配模式适配当前嵌入路径
如果不想改动embed语句,保持//go:embed internal/web/views/*,则嵌入的文件都是无目录前缀的直接文件,直接用*.html匹配所有HTML文件:
tmpl, err := template.ParseFS(viewsFS, "*.html")
如果目录下有子目录需要递归嵌入,先把embed语句改成递归模式:
//go:embed internal/web/views/** var viewsFS embed.FS
再用**/*.html匹配所有层级的HTML文件即可。
额外注意事项
- 确认embed路径是相对于当前源文件的正确相对路径,比如源文件在项目根目录的
cmd/main.go,internal/web/views就是正确路径;若源文件在internal/web下,路径应改为views/*; - 确保
internal/web/views目录下确实存在.html文件,无文件名拼写错误; - 你的Go版本需在1.16及以上(embed特性从Go 1.16开始支持);
- 所有带
{{define}}的模板文件,只要被成功匹配解析,会自动合并到同一个template.Template结构体中。
内容的提问来源于stack exchange,提问作者otaxhu
相关产品推荐
相关产品推荐

