不能在允许字符串文字的地方使用字符串类型的模板变量?

Can't use template variable of type string where a string literal would be allowed?

我似乎无法使用字符串类型的模板变量调用 .Resources.GetMatch,尽管我可以使用字符串文字调用它。我知道我可以在 with 块中使用 . 调用它,但想知道为什么这段代码不起作用。

主模板调用带有第二个参数的部分 .Scratch:

single.html
...html
<div >
    <p>Feature image:</p>
    {{ .Scratch.Set "arg1" .Params.image}}
    {{ partial "local-image.html" . }}
    <p>End feature image:</p>
  </div>

部分尝试检索 scratch 参数并检索相应的页面资源对象:

{{ $srcPath := (.Scratch.Get "arg1") }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{ .Resources.GetMatch $srcPath }}

Hugo 构建错误:

ERROR 2020/11/24 00:28:34 Failed to render pages: render of "page" failed: 
execute of template failed: template: _default/single.html:67:7: executing "main" at <partial "local-image.html" .>: 
error calling partial: "C:\Users\xyz\src\hugo-blog\themes\hugo-theme-bootstrap4-blog\layouts\partials\local-image.html:5:23": execute of template failed: 
template: partials/local-image.html:5:23: executing "partials/local-image.html" at <$srcPath>: 
invalid value; expected string

如果我注释掉失败的行,这样我就可以看到前面的调试输出,

{{ $srcPath := (.Scratch.Get "arg1") }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{/* .Resources.GetMatch $srcPath */}}

构建成功,页面呈现如下:

Feature image:

debug type string, value "IMG_20200404_164934.jpg"
End feature image:

所以这里的谜题是为什么 .Resources.GetMatch 抱怨 $srcPath 而后者显然是 string.

类型

(是的,我知道将多个参数传递给 dict 中的部分会更通俗,但我 运行 在提取部分中的值时遇到了类似的错误,所以出现了以上面更简洁的例子为例。)

我重写了有问题的代码并提出了一个可行的解决方案,但我从来没有发现上面我到底哪里出了问题(对于任何想指出我到底哪里出错的人来说,它仍然是可重现的)。

为了以可接受的答案结束此线程,我是这样做的。
或许对未来的游子有所帮助...

基本上,

  1. 将所有参数填充到调用部分的 dict 中。
  2. 在部分的顶部,保存 . 的值(例如在一个很好命名的本地 $args$argv
  3. 无论您在何处需要特定参数值,都可以在 $args.xyzzy
  4. 中轻松获得

我不知道为什么昨天我没有想到这个简单有效的模式,今天我在网上看到很多类似的建议...

single.html
...html
<div >
    <p>Feature image:</p>
    {{ partial "local-image.html" (dict "page" . "arg1" .Params.image) }}
    <p>End feature image:</p>
  </div>

然后,在部分中检索或使用这些参数:

{{ $args := . }}
. . .
{{ $srcPath := $args.arg1 }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{ .Resources.GetMatch $srcPath }}

构建成功,页面呈现如下:

Feature image:

debug type string, value "IMG_20200404_164934.jpg"
"IMG_20200404_164934.jpg"
End feature image:

Q.E.D.