Golang如何解析不同目录下的所有模板文件?
如何让Go模板同时解析多个目录下的文件
先说说你的场景:当前目录结构如下:
[root@abc]# ll drwxr-xr-x. 2 root root 133 Mar 26 16:13 credit drwxr-xr-x. 2 root root 132 Mar 26 16:17 form -rw-r--r--. 1 root root 6003 Mar 27 19:30 main.go
你之前用var tmpl = template.Must(template.ParseGlob("form/*"))能正常解析form目录下的所有文件,但尝试传入两个模式参数"form/*","credit/*"却失效了——这是因为template.ParseGlob只接受单个模式字符串参数,多参数的写法不符合函数签名,自然不会生效。
下面给你两种可行的解决方案:
方法一:链式调用ParseGlob
你可以先创建一个空模板,然后链式调用两次ParseGlob,分别加载两个目录下的模板文件:
var tmpl = template.Must(template.New("").ParseGlob("form/*").ParseGlob("credit/*"))
这里template.New("")创建一个基础空模板,第一次ParseGlob("form/*")加载form目录的内容后,返回的模板对象可以继续调用ParseGlob("credit/*")来合并credit目录的模板,最后用template.Must处理初始化时的错误。
方法二:先收集文件路径,再统一加载
如果需要更灵活的控制(比如只加载特定后缀的模板文件),可以先用filepath.Glob分别获取两个目录的文件路径,合并后再用template.ParseFiles批量加载:
package main import ( "html/template" "path/filepath" ) var tmpl *template.Template func init() { // 获取form目录下的所有文件路径 formFiles, err := filepath.Glob("form/*") if err != nil { panic(err) } // 获取credit目录下的所有文件路径 creditFiles, err := filepath.Glob("credit/*") if err != nil { panic(err) } // 合并两个目录的文件列表 allTemplateFiles := append(formFiles, creditFiles...) // 加载所有模板文件 tmpl = template.Must(template.ParseFiles(allTemplateFiles...)) }
这种方法的优势是你可以在合并文件列表前做额外处理,比如筛选.tmpl或.html后缀的文件,适配更复杂的场景。
这两种方法都能实现你想要的同时解析两个目录模板的需求,根据你的实际场景选择就行~
内容的提问来源于stack exchange,提问作者talsa
相关产品推荐
相关产品推荐

