Объединение двух условий в одно - PullRequest
2 голосов
/ 02 апреля 2019

ниже работает

{{- if hasKey (index $envAll.Values.policy) "type" }} 
{{- if has "two-wheeler" (index $envAll.Values.policy "type") }}
<code goes here>
{{- end }}
{{- end }}

, в то время как нижеприведенное не работает с «ошибкой времени выполнения: неверный адрес памяти или разыменование нулевого указателя»

{{- if and (hasKey (index $envAll.Values.policy) "type") (has "two-wheeler" (index $envAll.Values.policy "type")) }}
<code goes here>
{{- end}}

Нет списка по имени "type", объявленного в $ envAll.Values.policy.

В Go, если правый операнд вычисляется условно, почему последнее условие вычисляется во втором фрагменте кода? Как мне это решить?

Редактировать (поскольку он помечен как дубликат): К сожалению, я не могу использовать встроенный {{if}}, как указано в другом посте.

Я упростил мою проблему выше. Я действительно должен достичь этого ...

{{if or (and (condition A) (condition B)) (condition C)) }}
    <code goes here>
{{ end }}

1 Ответ

2 голосов
/ 02 апреля 2019

Вы получаете ошибку при использовании функции and, поскольку функция and в шаблонах Go не оценивается при коротком замыкании (в отличие от оператора && в Go), все ее аргументы вычисляются всегда. Подробнее об этом здесь: Шаблон Golang и тестирование на допустимые поля

Таким образом, вы должны использовать встроенные {{if}} действия, чтобы 2-й аргумент оценивался только в том случае, если первый также является истинным.

Вы отредактировали вопрос и заявили, что ваша настоящая проблема такова:

{{if or (and (condition A) (condition B)) (condition C)) }}
    <code goes here>
{{ end }}

Вот как вы можете сделать это только в шаблонах:

{{ $result := false }}
{{ if (conddition A )}}
    {{ if (condition B) }}
        {{ $result = true }}
    {{ end }}
{{ end }}
{{ if or $result (condition C) }}
    <code goes here>
{{ end }}

Другой вариант - передать результат этой логики в шаблон в качестве параметра.

Если вы не можете или не знаете результат до вызова шаблона, еще одним вариантом является регистрация пользовательской функции и вызов этой пользовательской функции из шаблона, и вы можете выполнить оценку короткого замыкания в коде Go. , Для примера см. Как вычислить что-то в html / template .

...