1 回答
TA贡献1820条经验 获得超10个赞
文本/模板,文本和空格的包文档:
默认情况下,执行模板时,将逐字复制操作之间的所有文本。[...]
但是,为了帮助设置模板源代码的格式,如果操作的左分隔符(默认为“{{”)紧跟减号和空格,则会从紧挨着的文本中删除所有尾随空格。同样,如果右侧分隔符 (“}}”) 前面有空格和减号,则会从紧随其后的文本中修剪所有前导空格。在这些修剪标记中,必须存在空格:“{{- 3}}”类似于“{{3}}”,但修剪紧挨着前面的文本,而“{{-3}}”解析为包含数字 -3 的操作。
TLDR;模板中的所有(空白)空间在操作之间保留。如果您不需要它们,则可以在操作“就地”的开始定界符之后或结束定界符之前使用减号来修剪前导或尾随的空格。-
您必须按照所需的输出方式缩进模板,或使用符号修剪格式缩进。-
您的操作的主要问题:{{if}}
{{if eq $vv.Id $performedBy}}
{{$pSurname = $vv.ContactData.Surname}} {{$pName = $vv.ContactData.Name}}
{{- end}}
在 的闭合分界符之后有一个换行符,如果执行 的主体,将保留该换行符。登录仅修剪此行符之前的换行符(变量赋值之后的换行符),而不是在 末尾。{{if}}{{if}}-{{- end}}{{- end}}{{if}}
例如,使用此模板:
const src = `{{$performedBy := "1"}}{{$pSurname := ""}}{{$pName := "" -}}
{{range $kk, $vv := .Users -}}
User idx: {{$kk}}
{{if eq $vv.Id $performedBy -}}
{{- $pSurname = $vv.ContactData.Surname -}} {{- $pName = $vv.ContactData.Name -}}
{{- end -}}
{{- end}}`
测试它:
type CData struct {
Surname, Name string
}
type User struct {
Id string
ContactData CData
}
func main() {
t := template.Must(template.New("").Parse(src))
p := map[string]interface{}{
"Users": []User{
{Id: "1", ContactData: CData{"Foo", "Bar"}},
{Id: "2", ContactData: CData{"Foo2", "Bar2"}},
{Id: "1", ContactData: CData{"Foo3", "Bar3"}},
{Id: "4", ContactData: CData{"Foo4", "Bar4"}},
},
}
if err := t.Execute(os.Stdout, p); err != nil {
panic(err)
}
}
输出(在Go Playground上尝试):
User idx: 0
User idx: 1
User idx: 2
User idx: 3
- 1 回答
- 0 关注
- 202 浏览
添加回答
举报