我有以下输入:
alerts:
api_http_500:
default_config:
enabled: true
override:
user_1:
enabled: false
我想检查用户是否已启用字段。如果不是这样,我使用默认值。我正在使用index和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
language支持局部变量。因此,我们可以将局部变量设置为text/template
值。如果不存在,则user_2
支持库包含可以产生空字典的Sprig函数。
dict
现在dict
始终是字典,因此我们可以在其中进行查找,或者如果那里没有任何内容,请使用默认值。
{{- $overrides := index $alerts "user_2" | default dict -}}
这看起来不错,但是另一个问题是,$overrides
不能区分存在但不存在与否。两者均为“ falsey”,并且将替换为默认值。标准模板{{- $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 -}}
要求值必须具有相同的类型,但是Sprig的default
没有此要求。
这可以让您编写详细的逻辑语句,如果覆盖为true,或者覆盖不为false(我不认为有办法拼出“ nil”或“ absent”),则应启用该选项,并且默认值为true。
eq
(值得考虑的是,您是否需要这么多的Go模板逻辑,以及是否可以重组值文件以简化此过程,还是使用诸如Kubernetes运算符之类的语言来使用更普通的语言并且更易于测试。)