- 开发工具
- 前端
- CLI
【免费下载链接】hugo
The world’s fastest framework for building websites.
.Get是 Hugo 短代码模板中读取调用参数的核心方法,支持按位置(.Get 0)或按名称(.Get "greeting")两种方式取值。本文基于官方方法文档 Get.md 并结合仓库源码,系统讲解.Get的完整用法、参数解析规则与底层实现原理,帮助你写出健壮、可复用的短代码模板。
方法概览
.Get在短代码模板上下文中(即模板内的.)调用,用于根据调用方传入的参数键读取对应值。
| 项目 | 说明 |
|---|---|
| 方法名 | Get |
| 签名 | SHORTCODE.Get ARG |
| 返回类型 | any(任意类型,可能是字符串、数字、布尔值等) |
| 适用范围 | layouts/_shortcodes/目录下的短代码模板 |
短代码的调用参数可通过两种方式传入:位置参数(positional arguments)和命名参数(named arguments)。调用时指定参数的方式,决定了模板中读取参数的方式。
位置参数(Positional arguments)
位置参数通过空格分隔的值列表传入,模板中使用从0开始的索引按顺序读取。
在 Markdown 内容中这样调用短代码:
{{</* myshortcode "Hello" "world" */>}}在对应的短代码模板layouts/_shortcodes/myshortcode.html中,按位置读取参数:
{{ printf "%s %s." (.Get 0) (.Get 1) }} → Hello world..Get 0返回第一个参数"Hello";.Get 1返回第二个参数"world"。
从源码结构看,位置参数在 Hugo 内部被解析为切片(slice)存储:在 shortcode.go 中,位置参数通过params = append(params, currItem.ValTyped(source))依次追加到一个[]any中,Get方法随后按整数索引从中取值。
命名参数(Named arguments)
命名参数通过key="value"的形式传入,模板中使用字符串键读取。
在 Markdown 内容中这样调用短代码:
{{</* myshortcode greeting="Hello" firstName="world" */>}}在短代码模板中按名称读取参数:
{{ printf "%s %s." (.Get "greeting") (.Get "firstName") }} → Hello world..Get "greeting"返回"Hello";.Get "firstName"返回"world"。
注意:参数名区分大小写。.Get "firstName"与.Get "firstname"是不同的键,后者将无法命中参数。这一点由 Get 方法源码 中的 map 索引查找逻辑决定——Hugo 以map[string]any形式存储命名参数(见 shortcode.go),map 的键匹配天然区分大小写。
位置参数与命名参数不可混用
在 Markdown 中调用短代码时,要么全部使用位置参数,要么全部使用命名参数,不能同时混用两种形式。例如下面的调用是非法的:
{{</* myshortcode greeting="Hello" "world" */>}} {{</* myshortcode "Hello" firstName="world" */>}}这一约束在词法分析阶段被强制执行。在 pagelexer_shortcode.go 的lexShortcodeParam函数中,解析器通过检测是否出现=来区分参数类型:
- 遇到
=判定为命名参数; - 以引号或反引号开头、不带
=的判定为位置参数; - 一旦检测到两种类型混用,立即报错,例如
got named parameter '...'. Cannot mix named and positional parameters或got positional parameter '...'. Cannot mix named and positional parameters。
上述错误信息在解析器的单元测试中有直接验证,见 pageparser_shortcode_test.go 中的two named params与混用报错用例。
[!NOTE] 并非所有短代码都同时支持两种参数形式:有些短代码只支持位置参数,有些只支持命名参数,另一些则两者皆可。具体以该短代码的文档说明为准。
底层实现:Get 方法源码解析
Get的完整实现位于 hugolib/shortcode.go,理解其逻辑有助于写出不踩坑的模板代码:
// Get is a convenience method to look up shortcode parameters by its key. func (scp *ShortcodeWithPage) Get(key any) any { if scp.Params == nil { return nil } if reflect.ValueOf(scp.Params).Len() == 0 { return nil } // ... switch key.(type) { case int64, int32, int16, int8, int: // 整数键:期望 Params 是切片 // 若 Params 是 map:返回 nil(不报错) // 若 Params 是切片:按索引取值,越界返回 "" case string: // 字符串键:期望 Params 是 map // 若 Params 是 map:按键取值,键不存在返回 "" // 若 Params 是切片:返回 nil(不报错) } // ... }结合ShortcodeWithPage结构体定义(shortcode.go)可以归纳出Get的完整返回值语义:
| 场景 | 返回值 |
|---|---|
短代码没有任何参数(Params为 nil 或空) | nil |
使用位置参数调用(Params为切片),索引越界 | 空字符串"" |
使用命名参数调用(Params为 map),键不存在 | 空字符串"" |
| 用整数键读取命名参数(键类型与存储形式不匹配) | nil(不报错) |
| 用字符串键读取位置参数(键类型与存储形式不匹配) | nil(不报错) |
关键设计点在于:类型不匹配时Get返回nil而非抛出错误。正如源码注释所说明,这是为了让开发者可以放心写出类似下面的链式降级写法,而无需额外的类型判断:
{{ $myParam := .Get "myParam" | default (.Get 0) }}即先尝试按名称读取,读不到(返回nil,被default捕获)时回退到按位置读取第一个参数。
参数值的类型推断
Get的返回类型是any,实际类型取决于调用时的书写形式,其判定逻辑在 parser/pageparser/item.go 的ValTyped函数中:
- 带引号的值:始终按字符串处理,即使内容看起来像数字或布尔值(例如
"123"、"true"); - 不带引号的
true/false:解析为布尔类型; - 不带引号的整数:解析为
int; - 不带引号的浮点数:解析为
float64(可含小数点,如3.14); - 其他:回退为字符串。
对应的解析器测试覆盖了float param, positional(位置浮点参数)等场景,见 pageparser_shortcode_test.go。
因此在模板中做比较时需留意类型:例如参数写成count=5时.Get "count"得到的是整数5,与字符串比较需要先string转换或用eq的宽松比较。
实战:与 Page.GetPage / site.GetPage 组合使用
.Get最典型的实战场景是"传递页面路径或资源名给短代码"——先读取参数,再交给 Page 方法做进一步查找。仓库测试 rendershortcodes_test.go 中include短代码的实现即为此模式:
{{ $p := site.GetPage (.Get 0) }} {{ $p.RenderShortcodes }}调用方式:
{{% include "p2" %}}即.Get 0读取位置参数"p2",再通过site.GetPage定位对应页面并渲染其短代码。类似地,page__fragments_test.go 中也有{{ with site.GetPage (.Get 0) }}的用法。
同样地,rendershortcodes_test.go 展示了.Get结合.Page.GetPage、资源查找的混合场景:
{{ $p := .Page.GetPage (.Get 0) }}小结
- 位置参数用整数索引读取(
.Get 0),命名参数用字符串键读取(.Get "name"); - 两种形式在调用侧不可混用,混用会在解析阶段直接报错;
- 参数名区分大小写;键不存在或索引越界时返回空字符串,类型不匹配时返回
nil; - 返回值类型由书写形式决定:带引号为字符串,
true/false、整数、浮点数会被自动类型化; - 常用组合模式:
.Get读取参数 →site.GetPage/.Page.GetPage等 Page 方法消费参数。
如需进一步了解短代码上下文的其它方法(如Inner、Params、IsNamedParams、Ordinal等),可查阅 Shortcode methods 索引 及其对应文档页;短代码参数从解析到存储的完整链路,可继续研读 shortcode.go 与 pagelexer_shortcode.go 两处源码。
- 开发工具
- 前端
- CLI
【免费下载链接】hugo
The world’s fastest framework for building websites.
相关推荐
Apache Spark SQL 函数调用(Function Invocation)完全指南:位置参数、命名参数与表参数
Apache Spark SQL 函数调用(Function Invocation)完全指南:位置参数、命名参数与表参数 本指南以 Apache Spark 官
大数据数据分析批处理流处理机器学习图计算urfave/cli v2 参数读取指南:用 `cli.Context.Args()` 处理命令行位置参数
urfave/cli v2 参数读取指南:用 cli.Context.Args 处理命令行位置参数 本篇指南围绕 docs/v2/examples/argume
CLI开发工具Bash函数参数传递终极指南:位置参数与数组参数的完全解析
Bash函数参数传递终极指南:位置参数与数组参数的完全解析 Bash脚本编程是现代开发者和系统管理员必备的核心技能之一。在Bash函数编程中,参数传递是最基础也
教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考