
go 的 html/template 默认使用 {{ 和 }} 作为动作分隔符;若模板中使用了 [[ 和 ]],但未通过 delims() 显式设置,则模板动作会被原样输出,而非被解析执行。
go 的 html/template 默认使用 {{ 和 }} 作为动作分隔符;若模板中使用了 [[ 和 ]],但未通过 delims() 显式设置,则模板动作会被原样输出,而非被解析执行。
在 Go 中,模板引擎对分隔符(delimiters)极为敏感。默认情况下,template.New() 创建的模板实例使用标准 Go 模板语法:{{ 开始、}} 结束。当你在 HTML 文件中写入 [[ template "head_start.html" ]],而模板引擎仍按 {{...}} 解析时,它会将整段内容视为普通文本——既不报错,也不执行,最终直接输出到响应体中,正如你看到的:
[[ template "head_start.html" ]] [[ template "head_end.html" ]] <b>Hello</b> [[ template "footer_start.html" ]] [[ template "footer_end.html" ]]
要解决此问题,有两种等效方案:
✅ 方案一:修改模板实例的分隔符(推荐用于已有 [[...]] 模板库)
在初始化模板时调用 .Delims("[[", "]]"):
var renderer = template.New("pigo").Delims("[[", "]]")
func loadTemplate() {
_, err := renderer.ParseGlob(Config.String("template") + "/*.html")
if err != nil {
log.Fatal("Failed to parse templates:", err)
}
}
⚠️ 注意:Delims() 必须在 ParseGlob() 或任何 Parse*() 方法之前调用,否则已解析的内容不会重新应用新分隔符。
✅ 方案二:统一改用默认分隔符(推荐新建项目或可修改模板时)
将所有模板文件中的 [[/]] 替换为 {{/}},例如:
{{ template "head_start.html" }}
{{ template "head_end.html" }}
<b>Hello</b>
{{ template "footer_start.html" }}
{{ template "footer_end.html" }}
此时无需修改 Go 代码,保持原始 template.New("pigo") 即可正常解析与执行。
? 额外提示:
- 使用 html/template 时,务必确保 ExecuteTemplate 的第二个参数(模板名)与实际解析进来的模板文件名完全匹配(含扩展名),例如 "home.html" 对应 home.html 文件;
- 建议在 loadTemplate() 中加入错误处理,避免静默失败;
- 若需同时支持多种分隔符或动态模板引擎,可考虑封装模板注册器,但日常开发中保持分隔符统一是更清晰、更安全的选择。











