控制 Go 模板中的缩进

Controlling indents in Go templates

我有以下 Go 模板:

{{ range $job, $steps := .jobs -}}
    {{ $job -}}:
    {{ range $steps -}}
        {{ . }}
    {{ end }}
{{- end }}

它正在生成如下所示的输出:

job1:
    step1
    step2
    job2:  <--- This should not be indented
    step1
    step2

job1 之后的所有作业都缩进四个空格。我不清楚为什么模板引擎会决定任意缩进剩余的作业。如何控制缩进以便输出显示为:

job1:
    step1
    step2
job2:
    step1
    step2

job2 的标识并非来自您认为的地方:它来自打印步骤之间的空格和换行符:

{{ range $steps -}}
   {{ . }}  <-- starting from here, and the indentation of the next line
{{ end }}

所以输出job1step2后的换行符和缩进,然后你就开始job2:已经缩进了。

如果您只在输出中需要的位置插入换行符和缩进,您会得到想要的结果:

{{ range $job, $steps := .jobs}}{{ $job }}:{{ range $steps }}
    {{ . }}{{ end }}
{{ end }}

或者按照你想要的方式格式化你的模板,并在所有地方禁用缩进,并在你想要的地方显式输出换行符和缩进:

{{ range $job, $steps := .jobs -}}
    {{- $job -}}:{{"\n"}}
    {{- range $steps -}}
        {{"    "}}{{- . -}}{{"\n"}}
    {{- end -}}
{{- end }}

或第三种解决方案:

{{ range $job, $steps := .jobs -}}
    {{ $job }}:
    {{- range $steps }}
    {{ . }}{{ end }}
{{ end }}

这些都是输出(在Go Playground上试试):

job1:
    step1
    step2
job2:
    step1
    step2