Основная ошибка состоит в том, что в данных нет поля user_2
, поэтому, когда вы пытаетесь его получить, вы получаете nil
; вы не можете делать более глубокие поиски в этом. default
все еще может прийти на помощь!
Go text/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
не различает 1035 *sh присутствует-но-ложно из отсутствующего; оба являются ложными и будут заменены значением по умолчанию. Стандартный шаблон eq
требует, чтобы значения имели один и тот же тип, но Sprig deepEqual
не имеет этого требования.
Это позволяет вам написать подробный логический оператор, который должен быть включенным, если переопределение истинно или если переопределение не ложно (я не думаю, что есть способ указать «ноль» или «отсутствует»), а значение по умолчанию - истина.
{{- $enabled := or $overrides.enabled (and (not (deepEqual $overrides.enabled false)) $defaults.enabled) -}}
(Стоит подумать, хотите ли вы столько Go шаблона logi c, и можете ли вы либо реструктурировать свой файл значений, чтобы упростить это, либо использовать что-то вроде оператора Kubernetes, который на более обычном языке и более тестируемый. )