Несмотря на то, что шаблоны Go являются почти функциями общего назначения, у них есть пара ограничений. Одним из таких ограничений является то, что они только возвращают строку; вы не можете написать основные c функциональные помощники, такие как map
или filter
, потому что вы не можете вернуть результирующий список.
Более простой подход к выполнению фильтрации, как вы показали, заключается в перемещении это до точки звонящего (и, возможно, повторить условие, если это необходимо в нескольких местах):
items:
{{- range .Values.namespaces }}
{{- if has $.Values.clusterProfile .profiles }}
- {{ .name }}
{{- end }}
{{- end }}
Хакерский способ заставить эту работу, как у вас есть, состоит в том, чтобы упорядочить список в какой-то другой строковый формат, например JSON:
{{- define "filteredNamespaces" -}}
...
{{ toJson $newList }}
{{- end -}}
{{- range include "filteredNamespaces" . | fromJson -}}...{{- end -}}
Также помните, что вы можете внедрить файлы значений Helm, используя опцию helm install -f
. Поэтому вместо того, чтобы перечислять каждую перестановку параметров и затем отфильтровывать те, которые вам не нужны, вы можете реструктурировать это так, чтобы namespaces:
содержал только список пространств имен, которые вы на самом деле хотите использовать, но затем вы используете другой файл значений для каждый профиль.