Go 的 html/template 默认使用 {{ 和 }} 作为动作分隔符;若模板中使用了 [[ 和 ]],必须显式调用 Delims() 设置匹配的分隔符,否则模板动作将被原样输出而不执行。
go 中自定义模板分隔符的正确配置方法:go 的 `html/template` 默认使用 `{{` 和 `}}` 作为动作分隔符;若模板中使用了 `[[` 和 `]]`,必须显式调用 `delims()` 设置匹配的分隔符,否则模板动作将被原样输出而不执行。
在 Go 中使用 template.ParseGlob() 加载模板时,模板语法能否被正确解析和执行,完全取决于模板引擎是否识别其中的动作标记(如 {{ template "xxx" }} 或 [[ template "xxx" ]])。你遇到的问题——浏览器中直接显示 [[ template "head_start.html" ]] 而非渲染结果——说明 Go 模板引擎未将其识别为可执行动作,而是当作普通文本原样输出。
根本原因在于:Go 的 html/template 包默认仅识别 {{ 和 }} 作为模板动作的起止分隔符。而你的模板文件中使用的是 [[ 和 ]],这与默认分隔符不匹配,因此所有 [[...]] 块均被忽略、不解析、不执行。
✅ 正确解决方案有两种(任选其一):
方案一:修改 Go 代码,适配现有模板的分隔符
在创建模板时,通过 Delims() 显式指定自定义分隔符:
var renderer = template.New("pigo").Delims("[[", "]]")
func loadTemplate() {
_, err := renderer.ParseGlob(Config.String("template") + "/*.html")
if err != nil {
log.Fatal("模板加载失败:", err)
}
}
⚠️ 注意:Delims() 必须在 ParseGlob() 之前调用;一旦模板已开始解析,再调用 Delims() 将无效。
方案二:修改模板文件,统一使用 Go 默认分隔符
将所有 [[ 和 ]] 替换为 {{ 和 }}(推荐用于新项目或团队协作场景,兼容性更好):
{{ template "head_start.html" }}
{{ template "head_end.html" }}
<b>Hello</b>
{{ template "footer_start.html" }}
{{ template "footer_end.html" }}
此外,请确保:
- 所有被 {{ template ... }} 引用的子模板(如 "head_start.html")已随 ParseGlob() 一同加载(即位于同一 glob 路径下且后缀匹配 *.html);
- 模板名称(如 "home.html")与文件名严格一致(含大小写和扩展名);
- ExecuteTemplate 的第二个参数是模板的 name(即 template.New("name") 中的 name 或 ParseGlob 解析出的文件 basename),而非文件路径。
总结:模板分隔符必须前后一致——要么统一改代码适配模板,要么统一改模板适配标准。二者缺一不可。优先采用方案二(使用默认 {{}}),可避免隐式依赖、提升可维护性与生态兼容性。











