在 go 的 html/template 中使用 .delims() 设置自定义分隔符后调用 parsefiles(),若未正确处理模板命名,会导致 nil pointer dereference panic;根本原因是模板树中存在未初始化的根模板,而 execute() 默认尝试执行根模板而非已解析的子模板。
该错误看似神秘,实则源于 Go 模板系统的命名与执行机制设计:当你调用 template.New(“test”).Delims(“{[{“, “}]}”) 创建一个新模板时,你创建的是一个空的、尚未解析的根模板(名为 “test”);随后调用 sherrifTmpl.ParseFiles(“index.html”) 会解析文件并生成一个同名或独立命名的子模板(默认以文件名 “index.html” 为模板名),但此时原始的 “test” 模板本身仍为空且未被正确关联。
关键问题在于:(*Template).Execute(w, data) 方法总是尝试执行接收者模板(即 “test”)本身,而非其子模板。而该根模板从未被解析,内部 t.esc(转义信息)字段为 nil,导致在 escape() 阶段触发空指针解引用——这正是 panic 堆栈中 html/template.(*Template).escape(0xc20803ad80, 0x0, 0x0) 的根源。
✅ 正确解决方案有两种(任选其一):