Helm模板中if块内赋值的$endList外部无法访问的原因排查
问题原因分析与修复方案
这个问题的核心是Go模板的变量作用域规则在搞鬼!
你看这段代码里的关键问题点:
{{- $endList := $global.Values.someElements -}} {{- if not $endList }} {{- $endList := list }} <!-- 这里就是bug根源! --> {{- range $nestedElement := $global.Values.nestedstructure.nested1 }} {{- $endList = append $endList $nestedElement.Code }} {{- end }} {{- end }}
在Go模板中,用:=声明的变量是局部作用域的——也就是说,你在if块内部用{{- $endList := list }}创建的$endList,和外面一开始声明的$endList完全是两个独立的变量!
当someElements为空时,你进入if块,在块内新建了一个空列表,然后往这个局部列表里追加元素,但块结束后,这个局部变量就被销毁了,外面的原始$endList还是保持最初的空值,所以后面的代码里它始终是空的。
修复方案
把if块内的变量声明改成赋值操作,去掉:=换成=就行:
{{ $global := .}} {{- $endList := $global.Values.someElements -}} {{- if not $endList }} {{- $endList = list }} <!-- 去掉冒号,直接对外部变量赋值 --> {{- range $nestedElement := $global.Values.nestedstructure.nested1 }} {{- $endList = append $endList $nestedElement.Code }} {{- end }} {{- end }} {{- $microservice := $global.Release.Name | replace "-" "" -}} {{- range $nestedElement := $global.Values.nestedstructure.nested1 }} {{if has $nestedElement.Code $endList }}
这样一来,if块内的操作都是直接修改外部已经声明的$endList变量,当块结束后,修改后的列表会被保留下来,后面的代码就能正确拿到包含追加元素的endList了。
内容的提问来源于stack exchange,提问作者Michał Konik
相关产品推荐
相关产品推荐

