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

时间:2020-05-07 14:24:31

标签: kubernetes-helm go-templates

我有以下输入内容:

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

我想检查用户是否已启用字段。如果不是这样,我使用默认值。 我正在使用indexdefault,如下所示:

{{ (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结构的情况下使用默认值。

1 个答案:

答案 0 :(得分:3)

根本的错误是数据中没有user_2字段,因此当您尝试获取它时,会得到nil;您无法在其中进行更深入的查找。 default仍然可以营救!

Go text/template language支持局部变量。因此,我们可以将局部变量设置为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不能区分“ present-but-false”和“ false”。两者均为“ falsey”,并且将替换为默认值。标准模板eq要求值必须具有相同的类型,但是Sprig的deepEqual没有此要求。

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

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

(值得考虑的是,您是否需要大量的Go模板逻辑,以及是否可以重组值文件以简化此过程,还是使用诸如Kubernetes运算符之类的语言,该语言的语言更普通,并且更具可测试性。)< / p>