如果索引不存在,如何使用默认值



我有以下输入:

alerts:
api_http_500:
default_config:
enabled: true
override:
user_1:
enabled: false

我想检查是否存在用户的启用字段。如果不是这样,我使用默认的。我正在使用索引和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还能来救援!

Gotext/template语言支持局部变量。因此,我们可以将局部变量设置为user_2值。如果不存在,Sprig支持库将包含一个dict函数,该函数可以生成一个空字典。

{{- $overrides := index $alerts "user_2" | default dict -}}

现在$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 -}}

这看起来不错,但另一个问题是default不能区分存在,而是区分虚假和不存在;两者都是"false",并将被替换为默认值。标准模板eq要求值具有相同的类型,但Sprig的deepEqual没有此要求。

这使您可以编写详细的逻辑语句,即如果覆盖为true,或者如果覆盖不为false(我认为没有办法拼写"nil"或"absence"(,并且默认值为true,则应启用该选项。

{{- $enabled := or $overrides.enabled (and (not (deepEqual $overrides.enabled false)) $defaults.enabled) -}}

(值得考虑的是,你是否想要这么多Go模板逻辑,以及你是否可以重组你的值文件来简化它,或者使用类似Kubernetes运算符的更正常的语言,更可测试。(

最新更新