template.ParseGlob()可以解析子目录中的模板吗?

时间:2015-08-31 11:07:28

标签: templates go

要清理模板文件夹,我想在子文件夹中保存常用模板。目前我有以下文件结构:

main.go
templates/index.tpl            # Main template for the main page
templates/includes/head.tpl
templates/includes/footer.tpl

head.tplfooter.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类似的问题,但答案仅提供了解决方法。

2 个答案:

答案 0 :(得分:3)

不,不能。

此处的文档非常明确:template.ParseGlob的{​​{1}}和@ filepath.Glob中的filepath.Glob的使用格式使用filepath.Matchhttps://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")
}