如果对象为nil,则在模板中显示默认内容,否则根据set属性显示

Eco*_*ium 5 go go-templates

在我的模板中,我想包含一些默认meta标签(90%的时间).但是,当设置特定属性时,我想显示一组不同的文本.

我知道我可以设置一个匿名struct和设置属性有两种"default""some-x".但是,这意味着,我需要向目前通过的90%的处理程序添加一个匿名结构nil.

有没有办法做类似的事情

{{if eq . nil}} 
   // default meta tag
{{else if eq .MetaValue "some-x"}} 
   //other
{{end}}
Run Code Online (Sandbox Code Playgroud)

如果我尝试上面的代码,它会编译,但不会做我想要的.感谢任何有关如何正确处理它的建议,而无需添加大量锅炉板.

谢谢!

Cer*_*món 9

{{if not .}}
   output when . is nil or otherwise empty including
     false, 0, and any array, slice, map, or string of length zero
{{else if eq .MetaValue "some-x"}}
       // some-x case
{{else}} 
       // other case
{{end}}
Run Code Online (Sandbox Code Playgroud)


Tec*_*ium 6

如果您想确保您只检查nil而不是检查0, false, 空字符串或任何其他虚假类型,您可以使用kindIs函数来完成此操作。

{{ if kindIs "invalid" . }} 
   // only if variable is literally nil. falsey values will fallthrough.
{{ else if eq .MetaValue "some-x" }} 
   // other
{{ else }}
   // final case, if any
{{ end }}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,只有在引入 [sprig 函数](https://github.com/Masterminds/sprig) 时,“kindIs”才可用 (2认同)

小智 5

我最近遇到了在 Helm Chart(使用 Go 模板,包括sprig)中识别 nil 与 0 值的问题,并且没有找到发布的任何解决方案,所以我想我应该在这里添加我的解决方案。

我想出了一种丑陋的解决方案,即引用该值,然后检查与“<nil>”匹配的字符串(带引号,因此您实际上要检查 (quote .Values.thing | eq "\" <零>\""))。这允许区分针对空值和定义的 0 值的测试。就我而言,我试图构建一个配置文件,其中一些默认选项非 0,因此当显式设置 0 时,我想知道设置了 0 而不是只是省略。

希望这对其他人有帮助。

如果有更好的方法来做到这一点那就太好了,但到目前为止我还没有找到任何不需要创建和添加我自己的模板函数的东西。