ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hugo 短代码参数读取全指南:深入解析 Shortcode.Get 的位置参数与命名参数

Hugo 短代码参数读取全指南:深入解析 Shortcode.Get 的位置参数与命名参数 开发工具前端CLI【免费下载链接】hugoThe 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命名参数通过keyvalue的形式传入模板中使用字符串键读取。在 Markdown 内容中这样调用短代码{{/* myshortcode greetingHello firstNameworld */}}在短代码模板中按名称读取参数{{ 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.gomap 的键匹配天然区分大小写。位置参数与命名参数不可混用在 Markdown 中调用短代码时要么全部使用位置参数要么全部使用命名参数不能同时混用两种形式。例如下面的调用是非法的{{/* myshortcode greetingHello world */}} {{/* myshortcode Hello firstNameworld */}}这一约束在词法分析阶段被强制执行。在 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。因此在模板中做比较时需留意类型例如参数写成count5时.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【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址https://gitcode.com/gh_mirrors/hu/hugo点击查看免费下载相关推荐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/argumeCLI开发工具Bash函数参数传递终极指南位置参数与数组参数的完全解析Bash函数参数传递终极指南位置参数与数组参数的完全解析 Bash脚本编程是现代开发者和系统管理员必备的核心技能之一。在Bash函数编程中参数传递是最基础也教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表