Go语言template.ParseGlob遇到模板定义名称不兼容时的行为是怎样的
问题结论
这种场景下渲染阶段会明确失败,模板渲染严格依赖{{define "xxx"}}声明的名称,和文件名无关,只要你调用的模板名和定义的名称不匹配就会报错。
具体原因说明
Go标准库的html/template包遵循以下规则:
ParseGlob方法仅会校验所有匹配模板文件的语法正确性,只要语法没问题,解析阶段不会抛出错误。你把布局模板里的定义改成not_base,只要语法对,ts, err = ts.ParseGlob("./templates/*.layout.tmpl")这行的err会是nil。- 错误发生在渲染阶段:你的页面模板第一行写的是
{{template "base" .}},这个指令的作用是从当前加载的模板集合里查找**名称完全等于base**的命名模板进行渲染,而你当前的模板集合里只有名为not_base的模板,不存在base模板,渲染时会直接抛出找不到对应模板的错误。 - 模板的命名完全由
{{define "xxx"}}里的字符串决定,和模板文件的文件名没有任何关联:就算你的布局文件叫base.layout.tmpl,只要里面define的名称是not_base,加载后的模板名就是not_base,不会自动继承文件名作为模板名。
修复方案
你可以二选一修改:
- 把布局文件里的
{{define "not_base"}}改成{{define "base"}},和页面模板调用的名称保持一致 - 或者把页面模板的第一行
{{template "base" .}}改成{{template "not_base" .}},和布局定义的名称保持一致
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

