使用 {{if}} 过滤范围时如何抑制 Go 文本/模板输出中的换行符

问题描述

这个问题与Golang template range newline removal有关,但没有被那里的答案解决

给定

type Data struct {
    Item    string
    IsFruit bool
}

var data = []Data{
    {"banana",true},{"apple",{"onion",false},{"peach",true}}

var Template = `
FRUITS ONLY
-----------------
{{range .}}{{if .IsFruit}}{{.Item}}{{else}}{{end}}
{{end -}}
-----------------
`

使用 Template 执行 data输出applepeach 之间包含不需要的换行符。

FRUITS ONLY
-----------------
banana
apple

peach
-----------------

我尝试了 {{--}} 的许多变体,但都没有设法抑制换行符。消除 {{else}} 也不起作用。

请注意,预过滤数据不是我实际应用的选项。

完整代码示例位于 https://goplay.space/#N_GyaWwjH0Y

解决方法

所需的输出,

FRUITS ONLY
-----------------
banana
apple
peach
-----------------

可以通过这样改变模板来获得。

var Template = `
FRUITS ONLY
-----------------
{{range .}}
{{- if .IsFruit}}{{println .Item}}{{end}}
{{- end -}}
-----------------
`

所需的见解是:

  1. 结束分隔符和结束分隔符之间的换行符很重要,因此需要使用 {{- 来抑制它们。
  2. 模板 println 函数在其输出中前置一个换行符。这可以防止以下行中的 {{- 使用它。

https://goplay.space/#I9LzPaAXMr0 的工作解决方案

IMO,https://pkg.go.dev/text/template 处的文本/模板文档将通过添加上述说明得到改进。