Hugo 短代码参数读取全指南:深入解析 Shortcode.Get 的位置参数与命名参数
2026/9/20 5:22:04 网站建设 项目流程
  • 开发工具
  • 前端
  • CLI

【免费下载链接】hugo

The world’s fastest framework for building websites.

项目地址:https://gitcode.com/gh_mirrors/hu/hugo
点击查看免费下载

.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 parametersgot 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 方法消费参数。

如需进一步了解短代码上下文的其它方法(如InnerParamsIsNamedParamsOrdinal等),可查阅 Shortcode methods 索引 及其对应文档页;短代码参数从解析到存储的完整链路,可继续研读 shortcode.go 与 pagelexer_shortcode.go 两处源码。

  • 开发工具
  • 前端
  • CLI

【免费下载链接】hugo

The world’s fastest framework for building websites.

项目地址:https://gitcode.com/gh_mirrors/hu/hugo
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询