html/template足够绝大多数项目使用,是iris默认且最稳妥的选择;它支持类型安全、自动html转义、嵌套模板、条件判断和循环,无需额外依赖,路径需严格匹配./views目录与.html后缀,reload、delims和viewdata作用域等细节决定是否生效。

模板引擎选 html/template 就够用
绝大多数项目不需要切换模板引擎,html/template 是 Iris 默认且最稳妥的选择。它原生支持 Go 的类型安全、自动 HTML 转义、嵌套模板、条件判断和循环,而且不引入额外依赖。别被文档里列的 pug、jet、ace 等名字晃花眼——除非团队已有成熟 pug 技能栈或强依赖某特性,否则换引擎只会增加构建复杂度和 debug 成本。
注册模板前必须确认目录结构和后缀
iris.HTML("./views", ".html") 这行代码不是“写上去就完事”,它严格依赖文件系统路径和扩展名匹配:
- 当前工作目录下必须真实存在
./views目录(不能是views/或./Views) - 模板文件名必须以
.html结尾(比如index.html,不能叫index.htm或index.tpl) - 路径中不能含中文或空格,否则在 Windows 或某些 CI 环境下会静默失败
- 如果用
go run main.go启动,工作目录就是main.go所在路径;用go build && ./app时,工作目录是执行命令的位置,不是二进制所在目录
修改模板后不生效?检查 Reload 和 Delims 配置
开发阶段模板改了但浏览器没变化,大概率是缓存或解析冲突导致:
-
tmpl.Reload(true)必须在app.RegisterView(tmpl)之前调用,否则无效 -
tmpl.Delims("${", "}")是为避免和 Vue/React 的{{}}冲突,但如果前端没用这类框架,没必要改,默认{{}}更直观 - 若用了自定义 delims,模板里所有变量引用都得同步改成
${.message},漏一个就会渲染为空 - Windows 下有时文件系统监听不敏感,可加
tmpl.AddBinary(…)或直接重启进程验证是否真没 reload
ctx.ViewData 传参失效?注意作用域和调用顺序
ctx.ViewData("key", value) 只对当次 ctx.View("x.html") 生效,且必须在 ctx.View() 之前调用:
- 如果在中间件里调了
ctx.ViewData,但 handler 里没再调一次,模板收不到数据 - 多个
ctx.ViewData同 key 会覆盖,不会合并;要传结构体或 map,别拆成一堆单独的ViewData - 模板中访问
{{.message}}时,.message是顶层字段,不是嵌套在某个对象里——除非你传的是map[string]interface{}{"message": "hi"},否则别写{{.data.message}} - 如果模板报
nil pointer evaluating interface {}.xxx,说明传的值是 nil,或结构体字段未导出(首字母小写)
ctx.View 后,后续扩展基本只是增删字段和嵌套模板的事。











