[已解决] Golang模板中循环修复问题求助

[已解决] Golang模板中循环修复问题求助 你好,

我是Go语言的初学者,正在为不同的类型感到困惑。这是用于Helm模板的。 在我的values.yaml文件中,我的变量结构如下:

receivers:
  opencensus:
    port: 55678
  zipkin:
    port: 9411
  jaeger:
    jaeger-thrift-tchannel-port: 14267
    jaeger-thrift-http-port: 14268
exporters:
  stackdriver:
    project: "vigilant-sol-256207"
    enable_tracing: true

我最终需要的结果是这样的:

data:
  oc-collector-config: |
    receivers:
      opencensus:
        port: 55678
      zipkin:
        port: 9411
      jaeger:
        jaeger-thrift-tchannel-port: 14267
        jaeger-thrift-http-port: 14268
    exporters:
      stackdriver:
        project: "vigilant-sol-256207"
        enable_tracing: true

这是我目前最接近的尝试:

  oc-collector-config: |
    receivers:
  {{- range $i, $receivers := .Values.receivers }}
  {{ $receivers | indent 6 }}
  {{ end }}
    exporters:
  {{- range $i, $exporters := .Values.exporters }}
  {{ $exporters | indent 6 }}
  {{ end }}

但是它抛出了以下错误: at <6>: wrong type for value; expected string; got map[string]interface {} 有人能解释一下我在这里做错了什么吗?我已经为此困扰了好几个小时。

非常感谢任何帮助。

诚挚的问候。


更多关于[已解决] Golang模板中循环修复问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

明白了! 这个最终可以工作了:

  {{- range $k, $v := .Values.receivers }}
    {{ $k | indent 2 }}:
      {{- range $k2, $v2 := $v }}
        {{ $k2 }}: {{ $v2 }}
    {{- end }}
  {{- end }}

此致,

更多关于[已解决] Golang模板中循环修复问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,又近了一步…… 使用相同的输入和我的模板中的这段代码:

  {{- range $k, $v := .Values.receivers }}
    {{ $k | indent 2 }}: {{ $v }}
  {{ end }}

现在的结果是:

receivers:
    jaeger: map[jaeger_thrift_http_port:14268 jaeger_thrift_tchannel_port:14267]
    opencensus: map[port:55678] 
    zipkin: map[port:9411]

但我还在努力处理最后那个 map。 有人能帮我一下吗?

此致,

Eric V.

在Go模板中,当使用indent函数时,它期望接收一个字符串类型的参数,但你传递的是map[string]interface{}类型。你需要将map转换为YAML格式的字符串。可以使用toYaml函数先转换,然后再缩进。

以下是修正后的模板代码:

data:
  oc-collector-config: |
    receivers:
{{ toYaml .Values.receivers | indent 6 }}
    exporters:
{{ toYaml .Values.exporters | indent 6 }}

toYaml函数会将map转换为YAML格式的字符串,然后indent 6会在每一行前添加6个空格的缩进,这样就能得到你期望的格式。

如果你需要更精确的控制每个接收器的缩进,可以使用嵌套的range循环:

data:
  oc-collector-config: |
    receivers:
{{- range $key, $value := .Values.receivers }}
      {{ $key }}:
{{ toYaml $value | indent 8 }}
{{- end }}
    exporters:
{{- range $key, $value := .Values.exporters }}
      {{ $key }}:
{{ toYaml $value | indent 8 }}
{{- end }}

这个版本会为每个接收器和导出器名称添加额外的缩进层级,使YAML结构更加清晰。

回到顶部