要清理模板文件夹,我想在子文件夹中保存常用模板。目前我有以下文件结构:
main.go
templates/index.tpl # Main template for the main page
templates/includes/head.tpl
templates/includes/footer.tpl
head.tpl
和footer.tpl
将在index.tpl
内调用,如下所示:
{{ template "head" . }}
<h1>My content</h1>
{{ template "footer" .}}
此外,使用template.ParseGlob()
解析文件。这是main.go
的摘录:
var views = template.Must(template.ParseGlob("src/templates/**/*"))
func Render(rw http.ResponseWriter, temp string, data interface{}) {
err := views.ExecuteTemplate(rw, temp, data)
if err != nil {
http.Error(rw, err.Error(), http.StatusInternalServerError)
}
}
func Index(rw http.ResponseWriter, req *http.Request) {
Render(rw, "index.tpl", nil)
}
每当我打开浏览器时,都会收到以下错误消息:html/template: "index.tpl" is undefined
。
是否可能使用此glob模式忽略index.tpl
?
我发现了this类似的问题,但答案仅提供了解决方法。
答案 0 :(得分:3)
不,不能。
此处的文档非常明确:template.ParseGlob
的{{1}}和@ filepath.Glob
中的filepath.Glob
的使用格式使用filepath.Match
(https://godoc.org/path/filepath#Match)的语法**
进行深度匹配。
(真的有助于仔细阅读文档。)
答案 1 :(得分:0)
您可以通过这种方式加载多个子目录。在这里,我们忽略子目录是否不存在。但是我们要确保可以加载带有模板的第一个目录。
func ParseTemplates() (*template.Template, error) {
templateBuilder := template.New("")
if t, _ := templateBuilder.ParseGlob("/*/*/*/*/*.tmpl"); t != nil {
templateBuilder = t
}
if t, _ := templateBuilder.ParseGlob("/*/*/*/*.tmpl"); t != nil {
templateBuilder = t
}
if t, _ := templateBuilder.ParseGlob("/*/*/*.tmpl"); t != nil {
templateBuilder = t
}
if t, _ := templateBuilder.ParseGlob("/*/*.tmpl"); t != nil {
templateBuilder = t
}
return templateBuilder.ParseGlob("/*.tmpl")
}