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

时间:2015-09-25 03:17:17

标签: go go-templates

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

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

有没有办法做类似

的事情
{{if eq . nil}} 
   // default meta tag
{{else if eq .MetaValue "some-x"}} 
   //other
{{end}}

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

谢谢!

3 个答案:

答案 0 :(得分:8)

{{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}}

答案 1 :(得分:4)

我最近遇到了一个问题,即在Helm Chart(使用Go模板,包括sprig)中识别nil vs 0值并且没有找到任何解决方案,所以我想我会添加我的。

我提出了一种丑陋的解决方案,引用该值,然后检查匹配“< nil>”的字符串(带引号,所以你实际上要检查(引用.Values.thing | eq“\”< nil> \“”))。这允许区分测试与空值和定义的0值。在我的情况下,我试图构建一个配置文件,其中一些默认选项是非0,所以当显式设置0时,我想知道0被设置而不是仅仅被省略。

希望这可以帮助其他人。

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

答案 2 :(得分:1)

如果要确保只检查nil,而不检查0false,空字符串或任何其他错误类型,则可以使用{{3} }来做到这一点。

{{ 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 }}