Bra*_*0um 2 go-templates kubernetes-helm
我有以下输入:
alerts:
api_http_500:
default_config:
enabled: true
override:
user_1:
enabled: false
Run Code Online (Sandbox Code Playgroud)
我想检查用户是否存在启用的字段。如果不是的话我就使用默认的。我正在使用索引,default如下所示:
{{ (index $alerts "alerts" "api_http_500" "override" "user_2" "enabled") | default (index $alerts "alerts" "api_http_500" "default_config" "enabled") }}
但我有这个错误<index $alerts "alerts" "user_2" "enabled">: error calling index: index of nil pointer。
我不知道如何在没有 if/else 结构的情况下使用默认值。
user_2根本错误是数据中没有字段,因此当您尝试获取它时,您会得到nil;你不能对此进行更深入的查找。 default还是可以出手相救的!
Go语言支持局部变量。text/template所以我们可以将局部变量设置为应该的user_2值。如果不存在,Sprig支持库包含一个dict可以生成空字典的函数。
{{- $overrides := index $alerts "user_2" | default dict -}}
Run Code Online (Sandbox Code Playgroud)
Now$overrides始终是一本字典,因此我们可以在其中查找,或者如果那里没有任何内容,则返回到默认值。
{{- $a := index $alerts.alerts "api_http_500" -}}
{{- $defaults := $a.default_config -}}
{{- $overrides := index $a.override "user_2" | default dict -}}
{{- $enabled := $overrides.enabled | default $defaults.enabled -}}
Run Code Online (Sandbox Code Playgroud)
这看起来不错,但另一个问题是它default无法区分“present-but-false”和“absent”;两者都是“falsey”并且将被替换为默认值。标准模板eq要求值具有相同的类型,但 SprigdeepEqual没有此要求。
这使您可以编写详细的逻辑语句,如果覆盖为真,或者覆盖不为假(我认为没有办法拼写出“nil”或“absent”)和默认值,则应启用该选项是真的。
{{- $enabled := or $overrides.enabled (and (not (deepEqual $overrides.enabled false)) $defaults.enabled) -}}
Run Code Online (Sandbox Code Playgroud)
(值得考虑的是,您是否需要这么多 Go 模板逻辑,以及您是否可以重组值文件来简化它,或者使用像 Kubernetes 操作符这样的更正常语言且更可测试的东西。)
| 归档时间: |
|
| 查看次数: |
4838 次 |
| 最近记录: |