微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Go 模板中修剪空行?

如何解决如何在 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 举报,一经查实,本站将立刻删除。