如何在Go Template中动态读取拼接命名的YAML参数?
问题
我有如下YAML参数:
nodes: one, two instanceMinOne: 1 instanceMaxOne: 2 instanceMinTwo: 4 instanceMaxTwo: 6
请问能否通过Go模板动态读取类似instanceMinOne这类由instanceMin加上nodes列表中的动态值组成的变量名?
以下是我期望实现的思路示例(该代码无法运行,仅作示意):
{{- range $nodeName := (split .Parameters.nodes) }} instance-min: {{ .Parameters.instanceMin$nodeName }} instance-max: {{ .Parameters.instanceMax$nodeName }} {{- end }}
解决方法
当然可以实现,但你示例里直接拼接变量名的写法行不通,得借助Go模板的内置函数来处理。
具体实现方式
核心思路是用printf拼接出完整的参数键名,再通过index函数从参数集合里取值。另外注意:
- 如果你用的是原生Go模板,得自己注册
split函数;要是用Helm这类已经扩展了模板功能的工具,split直接就能用。 - 分割
nodes后可能会有空格,记得用trim去掉。
可运行的模板代码
假设.Parameters是map类型,模板可以这么写:
{{- range $nodeName := split .Parameters.nodes "," }} {{- $cleanNode := trim $nodeName }} instance-min: {{ index .Parameters (printf "instanceMin%s" $cleanNode) }} instance-max: {{ index .Parameters (printf "instanceMax%s" $cleanNode) }} {{- end }}
补充说明
printf "instanceMin%s" $cleanNode会把前缀和节点名拼成完整的参数键,比如instanceMinOne。index是Go模板里从map中按键取值的标准方法,完美支持动态生成的键名。- 如果你的
.Parameters是结构体而不是map,那原生Go模板没法动态访问字段——毕竟Go是静态类型语言,这种情况建议先把结构体转成map再处理。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

