如何解决如何在 Go 模板中修剪空行?
go 版本 go1.16.3 windows/amd64
我使用模板/html 包。如果我将一个变量设置为 html,
示例
{{range $kk,$vv := .Users -}}
{{if eq $vv.Id $performedBy}}
{{$pSurname = $vv.ContactData.Surname}} {{$pName = $vv.ContactData.Name}}
{{- end}}
{{- end}}
每当我在一个范围内填充一个变量时,它都会给我写一个空行。我该怎么做才能防止这种情况再次发生?
解决方法
text/template
,Text and spaces: 的包文档
默认情况下,执行模板时,所有动作之间的文本都会被逐字复制。 [...]
然而,为了帮助格式化模板源代码,如果一个动作的左定界符(默认为“{{”)后面紧跟着一个减号和空格,那么所有尾随的空格都会从紧接在前面的文本中去除。类似地,如果右分隔符 ("}}") 前面有空格和减号,则从紧随其后的文本中删除所有前导空格。在这些修剪标记中,空格必须存在:“{{- 3}}”类似于“Go Playground”,但修剪紧接在前面的文本,而“{{-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)
}
}
输出(在 enter image description here 上尝试):
User idx: 0
User idx: 1
User idx: 2
User idx: 3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。