如果索引不存在,如何使用默认值
How to use default if index does not exists
我有以下输入:
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 supports local variables. So we can set a local variable to what should be the user_2
value. If that's not present, the Sprig support library includes a 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 和 absent;两者都是 "falsey" 并将被替换为默认值。标准模板 eq
要求值具有相同类型,但 Sprig 的 deepEqual
没有此要求。
这让您可以编写详细的逻辑语句,如果覆盖为真或覆盖不为假,则应启用该选项(我认为没有办法拼出 "nil" 或"absent"),默认为真。
{{- $enabled := or $overrides.enabled (and (not (deepEqual $overrides.enabled false)) $defaults.enabled) -}}
(值得考虑的是你是否需要这么多 Go 模板逻辑,以及你是否可以重组你的值文件来简化它,或者使用像 Kubernetes 运算符这样的东西,它使用更普通的语言并且更易于测试。 )
我有以下输入:
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 supports local variables. So we can set a local variable to what should be the user_2
value. If that's not present, the Sprig support library includes a 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 和 absent;两者都是 "falsey" 并将被替换为默认值。标准模板 eq
要求值具有相同类型,但 Sprig 的 deepEqual
没有此要求。
这让您可以编写详细的逻辑语句,如果覆盖为真或覆盖不为假,则应启用该选项(我认为没有办法拼出 "nil" 或"absent"),默认为真。
{{- $enabled := or $overrides.enabled (and (not (deepEqual $overrides.enabled false)) $defaults.enabled) -}}
(值得考虑的是你是否需要这么多 Go 模板逻辑,以及你是否可以重组你的值文件来简化它,或者使用像 Kubernetes 运算符这样的东西,它使用更普通的语言并且更易于测试。 )