如何在 Go 模板中解压字典列表

问题描述 投票:0回答:1

这是一个玩具示例

{{/*Merge a list of objects*/}}
{{- define "mymerge" }}
    {{- toYaml (merge .) }}
{{- end }}

{{- define "mymergewrapper" }}
    {{- $dict1 := (dict "data" (dict "dict1key" "dict1val"))}}
    {{- $dict2 := (dict "data" (dict "dict2key" "dict2val"))}}
    {{- $dict3 := (dict "data" (dict "dict3key" "dict3val"))}}
    {{- $dict4 := (dict "data" (dict "dict3key" "dict4val"))}}
    {{- $arbitrary_list_of_dicts_of_unknown_length_and_content := (list $dict1 $dict2 $dict3 $dict4) }}
    {{- include "mymerge" $arbitrary_list_of_dicts_of_unknown_length_and_content }}
{{- end }}

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name | printf "%s-%s" .Chart.Name }}
data:
  myvalue: "Hello World"
  whatHappens:
  {{- include "mymergewrapper" . }}
 helm install myappchart2 myappchart2/ --debug --dry-run
Error: INSTALLATION FAILED: template: myappchart2/templates/deployment.yaml:22:6: executing "myappchart2/templates/deployment.yaml" at <include "mymergewrapper" .>: error calling include: template: myappchart2/templates/deployment.yaml:12:8: executing "mymergewrapper" at <include "mymerge" $arbitrary_list_of_dicts_of_unknown_length_and_content>: error calling include: template: myappchart2/templates/deployment.yaml:3:22: executing "mymerge" at <.>: wrong type for value; expected map[string]interface {}; got []interface {}
helm.go:84: [debug] template: myappchart2/templates/deployment.yaml:22:6: executing "myappchart2/templates/deployment.yaml" at <include "mymergewrapper" .>: error calling include: template: myappchart2/templates/deployment.yaml:12:8: executing "mymergewrapper" at <include "mymerge" $arbitrary_list_of_dicts_of_unknown_length_and_content>: error calling include: template: myappchart2/templates/deployment.yaml:3:22: executing "mymerge" at <.>: wrong type for value; expected map[string]interface {}; got []interface {}

我读到“将两个或更多字典合并为一个......”有点太快了。

有没有办法解压我的

$objects
列表并将各个字典传递给
merge

kubernetes-helm go-templates sprig-template-functions
1个回答
0
投票

合并函数有一个可变参数。 模板不支持将切片作为可变参数传递

使用循环逐一合并:

{{- $dict1 := (dict "data" (dict "dict1key" "dict1val")) }}
{{- $dict2 := (dict "data" (dict "dict2key" "dict2val")) }}
{{- $dict3 := (dict "data" (dict "dict3key" "dict3val")) }}
{{- $dict4 := (dict "data" (dict "dict3key" "dict4val")) }}
{{- $objects := (list $dict1 $dict2 $dict3 $dict4) }}
{{- $dest := (dict) }}
{{- range $objects}}{{merge $dest .}}{{end}}
{{- toYaml $dest }}
© www.soinside.com 2019 - 2024. All rights reserved.