
本文系统梳理 Hugo 中模板语法的核心构成,明确区分 Go 标准模板函数与 Hugo 扩展函数,帮助开发者准确理解 {{ range }} 等语法的本质、来源及可用范围,避免误用原生 Go 函数导致编译失败。
本文系统梳理 hugo 中模板语法的核心构成,明确区分 go 标准模板函数与 hugo 扩展函数,帮助开发者准确理解 `{{ range }}` 等语法的本质、来源及可用范围,避免误用原生 go 函数导致编译失败。
Hugo 的模板语法基于 Go 的 text/template 包,但并非所有 Go 函数都可在 Hugo 模板中直接使用。Hugo 仅暴露了一组经过严格筛选和安全封装的函数集合,分为两类:
✅ Go 内置模板函数(来自 text/template)
这些是 Go 标准库原生支持的基础函数,如:
- {{ range }}:遍历切片、数组、map 或通道,类似 for 循环;
- {{ if }}, {{ else }}, {{ with }}:条件与作用域控制;
- {{ printf }}:格式化输出(支持 %s, %d 等动词);
- {{ index }}:按索引或键访问数据(如 {{ index .Params "tags" }});
- {{ len }}:获取长度;{{ first }}, {{ last }}, {{ after }}, {{ slice }}:切片操作。
✅ Hugo 专属扩展函数(Hugo 自定义并注入)
Hugo 在 Go 原生能力基础上,大量增强面向静态站点的实用功能,例如:
- {{ .Site.Pages }}、{{ .Pages.ByDate }}:页面集合与排序;
- {{ $.Site.GetPage }}:跨上下文获取页面;
- {{ dateFormat "2006-01-02" .Date }}:日期格式化;
- {{ markdownify }}:将 Markdown 字符串安全渲染为 HTML;
- {{ resources.Get }}、{{ .Resources.ByType }}:资源管理(图片、CSS 等);
- {{ $var := "value" }}:变量赋值(需配合 with 或 range 使用)。
⚠️ 注意事项:
- ❌ 不可直接调用 Go 标准库函数(如 strings.ToUpper、time.Now()),除非 Hugo 显式封装(如 upper、now);
- ❌ 不支持 Go 方法调用语法(如 .Title.String()),应改用 Hugo 提供的等效函数(如 title .Title);
- ✅ 所有可用函数均在官方文档中明确定义——务必以 Go text/template 官方文档 和 Hugo 模板函数参考 为准,而非猜测或尝试任意 Go 代码。
示例:正确遍历并渲染文章列表
{{ range .Site.RegularPages.ByPublishDate.Reverse }}
<article><h2>{{ .Title | title }}</h2>
<time>{{ .Date | dateFormat "2006-01-02" }}</time><p>{{ .Summary | markdownify }}</p>
</article>
{{ end }}
总结:Hugo 模板 ≠ Go 代码执行环境,而是受限、安全、语义明确的声明式渲染层。掌握其函数边界,善用官方文档分类查阅(内置函数 vs Hugo 函数),是写出健壮、可维护模板的关键前提。










