01-注释、作用域、空格和空行、管道

1. 注释 {{/* xxxx */}}

{{/* xxxx */}}

2. 作用域

2.1 顶级作用域 {{ . }}

  • 代码
package main

import (
	"html/template"
	"os"
)

type Person struct {
	Name string
	Age  int64
}

func main() {
	p := Person{"GuanYu",25}
	tmpl := template.New("test")
	tmpl = template.Must(tmpl.Parse("Name: {{.Name}}, Age: {{.Age}}\nAll: {{.}}"))
	_ = tmpl.Execute(os.Stdout, p)
}
  • 输出
Name: GuanYu, Age: 25
All: {GuanYu 25}

这里{{.Name}}{{.Age}}中的点"."代表的是顶级作用域的对象p,所以Execute()方法执行的时候,会将{{.Name}}替换成p.Name,同理{{.Age}}替换成{{p.Age}}

  • 另一种写法

模板换行我们也可以不写 \n,而用"反引号"代替"引号"

package main

import (
	"html/template"
	"os"
)

type Person struct {
	Name string
	Age  int64
}

func main() {
	p := Person{"GuanYu",25}
	tmpl := template.New("test")
	tmpl = template.Must(tmpl.Parse(`
Name: {{.Name}}
Age: {{.Age}} 
All {{ . }}
`))
	_ = tmpl.Execute(os.Stdout, p)
}

结果显示

Name: GuanYu
Age: 25 
All {GuanYu 25}

2.2 相对作用域 {{range . }} xxxx {{end}}

{{range . }} xxxx {{end}}

  • 完整代码
package main

import (
	"os"
	"text/template"
)

type Weapon struct {
	WeaponName string
	Attack int
}

type User struct {
	UserName string
	Weapons   []Weapon
	Wives  []string
}

func main() {
	t := template.New("test")
	t = template.Must(t.Parse(
		`姓名:{{.UserName}}
{{- range .Weapons }}
武器: {{.WeaponName}}
{{- end }}
{{- range .Wives  }}
妻子: {{ . }}
{{- end }}`))
	WeaponL := Weapon{WeaponName:"双股剑(雄)" }
	WeaponR := Weapon{WeaponName:"双股剑(雌)" }
	p := User{UserName: "刘备",
		Weapons:  []Weapon{WeaponL,WeaponR},
		Wives: []string{"甘夫人","糜夫人","孙尚香"}}
	t.Execute(os.Stdout, p)
}
  • 输出
姓名:刘备
武器: 双股剑(雄)
武器: 双股剑(雌)
妻子: 甘夫人
妻子: 糜夫人
妻子: 孙尚香

说明:

  • template开始时,顶级作用域在p,因此{{- range .Weapons }}可指向p.Weapons
  • 而进入range循环后则进入一个p.Weapons内的相对域,因此{{.WeaponName}}指向了绝对位置p.Weapons.WeaponName
  • 后边妻子的循环与此相同

2.3 切换作用域 {{with .xxx }} xxx {{end}}

  • 代码
package main

import (
	"os"
	"text/template"
)

type Weapon struct {
	WeaponName string
	Attack int
}

type User struct {
	UserName string
	Weapons   []Weapon
	Wives  []string
}

func main() {
	t := template.New("test")
	t = template.Must(t.Parse(
		`姓名:{{.UserName}}
{{- with .Weapons }}
{{- range . }}
武器: {{.WeaponName}}
{{- end }}
{{- end }}
{{- range .Wives  }}
妻子: {{ . }}
{{- end }}`))
	WeaponL := Weapon{WeaponName:"双股剑(雄)" }
	WeaponR := Weapon{WeaponName:"双股剑(雌)" }
	p := User{UserName: "刘备",
		Weapons:  []Weapon{WeaponL,WeaponR},
		Wives: []string{"甘夫人","糜夫人","孙尚香"}}
	t.Execute(os.Stdout, p)
}
  • 显示结果
姓名:刘备
武器: 双股剑(雄)
武器: 双股剑(雌)
妻子: 甘夫人
妻子: 糜夫人
妻子: 孙尚香

说明:

  • template开始时,顶级作用域在p
  • {{ with .Weapons }}开始到第二个{{- end }}之间,顶级作用域切换到p..Weapons
    因此其中的 {{- range . }} 则在p.Weapons中循环(而不是p
  • 到切换作用域结束后(第二个{{- end }}),依然使用{{- range .Wives }} 指到p..Wives

3. 去空格和去空行 {{- xxx}}

3.1 去空行

  • 之前“1.2”中的例子中我们可以看见很多-,比如{{- range . }}{{- end }},这些是为了消除空行,其输出如下:
姓名:刘备
武器: 双股剑(雄)
武器: 双股剑(雌)
妻子: 甘夫人
妻子: 糜夫人
妻子: 孙尚香
  • {{- range . }}{{range . }}

如果我们将第一个range修改为{{range . }}

	t = template.Must(t.Parse(
		`姓名:{{.UserName}}
{{- with .Weapons }}
{{range . }}
武器: {{.WeaponName}}
{{- end }}
{{- end }}
{{- range .Wives  }}
妻子: {{ . }}
{{- end }}`))

则输出如下:

姓名:刘备

武器: 双股剑(雄)
武器: 双股剑(雌)
妻子: 甘夫人
妻子: 糜夫人
妻子: 孙尚香

我们可以看到,在第一个range的位置出现了一个空行。

  • {{- end}}{{end }}
    如果我们将第一个end处改为{{end }}
	t = template.Must(t.Parse(
		`姓名:{{.UserName}}
{{- with .Weapons }}
{{range . }}
武器: {{.WeaponName}}
{{end }}
{{- end }}
{{- range .Wives  }}
妻子: {{ . }}
{{- end }}`))
  • 则输出如下:
姓名:刘备

武器: 双股剑(雄)

武器: 双股剑(雌)

妻子: 甘夫人
妻子: 糜夫人
妻子: 孙尚香

可见,每次循环读取都会因end产生一个空行。

3.2 去空格

  • 我们在妻子和值之间加很多空格妻子: {{ . }}
package main

import (
	"os"
	"text/template"
)

type Weapon struct {
	WeaponName string
	Attack int
}

type User struct {
	UserName string
	Weapons   []Weapon
	Wives  []string
}

func main() {
	t := template.New("test")
	t = template.Must(t.Parse(
		`姓名:{{.UserName}}
{{- with .Weapons }}
{{range . }}
武器: {{.WeaponName}}
{{- end }}
{{- end }}
{{- range .Wives  }}
妻子:       {{ . }}
{{- end }}`))
	WeaponL := Weapon{WeaponName:"双股剑(雄)" }
	WeaponR := Weapon{WeaponName:"双股剑(雌)" }
	p := User{UserName: "刘备",
		Weapons:  []Weapon{WeaponL,WeaponR},
		Wives: []string{"甘夫人","糜夫人","孙尚香"}}
	t.Execute(os.Stdout, p)
}

则结果如下:

姓名:刘备

武器: 双股剑(雄)
武器: 双股剑(雌)
妻子:       甘夫人
妻子:       糜夫人
妻子:       孙尚香
  • 现在我们去掉这些空格,以上代码修改如下:

修改为妻子: {{- . }}

	t = template.Must(t.Parse(
		`姓名:{{.UserName}}
{{- with .Weapons }}
{{range . }}
武器: {{.WeaponName}}
{{- end }}
{{- end }}
{{- range .Wives  }}
妻子:       {{- . }}
{{- end }}`))

则结果为:

姓名:刘备

武器: 双股剑(雄)
武器: 双股剑(雌)
妻子:甘夫人
妻子:糜夫人
妻子:孙尚香

如果是{{ xxxx }}后边有空格,则将-写在右侧{{ xxxx -}}

4. 管道 {{ | }}

将前边的结果传给后边最后一个位置

  • 代码
package main

import (
	"os"
	"text/template"
)

func main() {
	t := template.New("xiShu")
	t = template.Must(t.Parse(
`{{printf "%q" "关羽"}}
{{"关羽" | printf "%q"}}
{{"关羽" | printf "%q" | printf "%q"}}`))
	p := ""
	t.Execute(os.Stdout, p)
}
  • 结果
"关羽"
"关羽"
"\"关羽\""

说明:

  • 第一个正常打印关羽
  • 第二个将关羽通过管道符传到后边的最后一个位置
  • 第三个,有两个管道符,依次处理,因此加了两层引号(%q是带引号打印,处理一次加一层)

posted on 2022-08-29 19:10  运维开发玄德公  阅读(71)  评论(0编辑  收藏  举报  来源

导航