Show default content in a template if an object is nil otherwise show based on the set property

huangapple go评论88阅读模式
英文:

Show default content in a template if an object is nil otherwise show based on the set property

问题

在我的模板中,我想要包含一些默认的meta标签(90%的情况下)。然而,当设置了特定的属性时,我想要显示不同的文本。

我知道我可以设置一个匿名的struct,并使用"default""some-x"来设置属性。然而,这意味着我需要在90%的处理程序中添加一个匿名的struct,目前只是传递nil

有没有办法像下面这样做:

{{if eq . nil}} 
   // 默认的meta标签
{{else if eq .MetaValue "some-x"}} 
   // 其他
{{end}}

如果我尝试像上面的代码一样,它可以编译,但不会达到我想要的效果。感谢任何关于如何正确处理它而不添加大量样板代码的建议。

谢谢!

英文:

In my template, I would like to include some default meta tags (90% of the time). However, when a specific property is set, I would like to show a different set of text.

I know I can set an anonymous struct and set a property with either "default" or "some-x". However, this means, I need to add an anonymous struct to 90% of my handlers that just currently pass nil.

Is there way to do something like

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

If I try something like my above code, it compiles but doesn't do what I want. Appreciate any suggestions on how to handle it properly without adding a lot of boiler plate.

Thanks!

答案1

得分: 24

{{如果不 .}}
当 . 为 nil 或者为空,包括 false、0,以及任何长度为零的数组、切片、映射或字符串时的输出
{{否则如果 .MetaValue 等于 "some-x"}}
// some-x 情况
{{否则}}
// 其他情况
{{结束}}

英文:
{{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}}

答案2

得分: 10

如果你想确保只检查nil而不是0false、空字符串或任何其他假值类型,你可以使用kindIs函数来实现这一点。

{{ if kindIs "invalid" . }} 
   // 只有当变量确实为nil时才执行。假值将会被忽略。
{{ else if eq .MetaValue "some-x" }} 
   // 其他情况
{{ else }}
   // 最后一种情况,如果有的话
{{ end }}
英文:

If you want to ensure you're only checking against nil and not 0, false, the empty string, or any other falsey type, you can use the kindIs function to accomplish this.

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

答案3

得分: 5

我最近遇到了一个问题,无法在Helm Chart(使用Go模板,包括sprig)中区分nil和0值,并且没有找到任何解决方案的帖子,所以我想在这里添加我的解决方案。

我想到了一种有点丑陋的解决方案,就是引用该值,然后检查是否存在与"<nil>"(带引号,所以实际上你将检查(quote .Values.thing | eq ""<nil>""))相匹配的字符串。这样可以区分对空值和定义的0值进行测试。在我的情况下,我正在尝试构建一个配置文件,其中一些默认选项是非0的,因此当明确设置为0时,我想知道是否设置了0,而不仅仅是省略了。

希望这对其他人有所帮助。

希望能有更好的方法来解决这个问题,但到目前为止,我还没有找到任何不需要创建和添加自己的模板函数的方法。

英文:

I've been recently facing an issue with identifying nil vs 0 values in a Helm Chart (which uses Go templates, including sprig) and haven't found any solutions posted, so I thought I'd add mine here.

I came up with a kind of ugly solution which is to quote the value and then check for a string that matches "<nil>" (with quotes, so you'd actually be checking (quote .Values.thing | eq ""<nil>"")). This allows differentiating tests against empty values vs defined 0 values. In my case, I was trying to build a config file where some default options were non-0, so when 0 was explicitly set, I wanted to know that 0 was set instead of just omitted.

Hopefully this can be a help to someone else.

It would be nice to have a better way to do this, but so far I haven't found anything that doesn't require creating and adding my own template functions.

1: https://github.com/Masterminds/sprig "sprig"

huangapple
  • 本文由 发表于 2015年9月25日 11:17:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/32774234.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定