Go 模板中 {{range}} 会默认保留前后空白和换行,导致生成代码缩进错乱;通过合理使用 - 修剪符(whitespace trimming)可精准消除多余换行,同时保持结构清晰与缩进一致性。
go 模板中 `{{range}}` 会默认保留前后空白和换行,导致生成代码缩进错乱;通过合理使用 `-` 修剪符(whitespace trimming)可精准消除多余换行,同时保持结构清晰与缩进一致性。
在 Go 模板中,{{range}} 和 {{end}} 之间的换行符、空格等空白字符会被原样输出,这在生成结构化代码(如 Go struct 定义)时极易破坏格式——既产生多余空行,又可能吞掉关键缩进。根本解法是有选择地在动作分隔符两侧添加 - 符号,实现“修剪左侧空白”或“修剪右侧空白”。
{{- ...}} 表示去除左侧所有连续空白(含换行、制表符、空格)直到上一个非空白字符;
{{... -}} 表示去除右侧所有连续空白直到下一个非空白字符;
{{- ... -}} 则双向修剪。
回到原始问题:目标是让每个字段独占一行、无空行,且 } 严格对齐到 struct { 的缩进层级。正确写法如下:
type {{makeGoTableName .TableName}} struct {
{{- range $key, $value := .TableData}}
{{makeGoColName $value.ColName}} {{$value.ColType}} `db:"{{makeDBColName $value.ColName}}",json:"{{$value.ColName}}"`
{{- end}}
}关键点解析:
- {{- range ...}}:删除 struct { 后的换行与首行缩进前的空白,使第一行字段紧贴 { 下方;
- {{- end}}:删除 end 动作之后的所有空白(包括换行),确保 } 紧跟最后一行字段的换行之后,而非被额外空行隔开;
- 字段行内部不加 -(如 {{$value.ColType}} 后不写 -),以保留其后的换行,维持每字段一行的结构。
⚠️ 注意事项:
- 修剪符只影响模板源码中的空白,不影响模板函数(如 makeGoColName)的返回值内容;
- 缩进应由模板文本本身控制(如手动缩进 2 或 4 个空格),而非依赖数据逻辑;
- 若字段间需逗号分隔(如 JSON tag 场景),需在 {{end}} 前用 {{if not last}} ,{{end}} 手动处理,但本例中换行即为自然分隔符,无需额外符号。
综上,Go 模板空白控制的核心在于「最小干预原则」:仅在 range 开头和 end 处使用 {{- 和 -}},其余位置保持原样,即可兼顾可读性与生成质量。


















