1. 模板标签
模板标签用"{{"和"}}"括起来
2. 注释
# 使用"{{/*"和"*/}}"来包含注释内容
{{/* a comment */}}
3. 变量
# 输出当前变量值
{{.}}
# 输出struct对象中字段或方法名称为"Abc"的值。
{{.Abc}}
# 定义变量
# 变量名用字母和数字组成并带上"$"前缀,采用符号":="进行赋值。
{{$article := "hello"}}
# 调用方法"Func",并传递参数,输出其返回值。
# 方法必须有一到两个返回值,如果是两个,第二个一定是error接口类型
{{.Func "参数1" "参数2"}}
4. 判断
{{if .condition1}} T1 {{else if .contition2}} T0 {{end}}
# and 与
{{if and .condition1 .condition2}} T1 {{end}}
# or 或
{{if or .condition1 .condition2}} T1 {{end}}
# not 非
{{if not .condition}} T1 {{end}}
# eq 等于
{{if eq .var1 .var2}} T1 {{end}}
# ne 不等于
{{if ne .var1 .var2}} T1 {{end}}
# lt 小于
{{if lt .var1 .var2}} T1 {{end}}
# le 小于等于
{{if le .var1 .var2}} T1 {{end}}
# gt 大于
{{if gt .var1 .var2}} T1 {{end}}
# ge 大于等于
{{if ge .var1 .var2}} T1 {{end}}
5. 遍历
# 通过i,v来访问
{{range $i, $v := .slice}} {{$i}} => {{$v}} {{end}}
# 通过.来访问
{{range .slice}} {{.}} {{end}}
# 当没有可遍历值时,执行else
{{range .slice}} T1 {{else}} T0 {{end}}
6. 子模板嵌套
{{define "T1"}}ONE{{end}}
{{define "T2"}}TWO{{end}}
{{define "T3"}}{{template "T1"}} {{template "T2"}}{{end}}
{{template "T3"}}
输出:
ONE TWO
7. 示例
7.1 字符串模板
type Inventory struct {
Material string
Count uint
}
func main() {
sweaters := Inventory{"wool", 17}
tmpl, err := template.New("test").Parse("{{.Count}} of {{.Material}}\n") // {{.Count}}获取struct的Count值
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, sweaters) //返回 17 of wool
if err != nil {
panic(err)
}
}
7.2 文件模板
type Inventory struct {
Material string
Count uint
}
/*
# cat templateContent.txt
{{.Count}} of {{.Material}}
*/
func main() {
sweaters := Inventory{"wool", 17}
tmpl, err := template.ParseFiles("templateContent.txt") //这里不需要使用new(),因为会默认使用文件名来命名
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, sweaters) //返回 17 of wool
if err != nil {
panic(err)
}
}
7.3 调用方法
type MyMethod struct {
Name string
}
func (my *MyMethod) SayHello() string { //没参数
return "hello world"
}
func (my *MyMethod) SayYouName(name string) string { //有参数
return "my name is : " + name
}
func main() {
mine := &MyMethod{Name: "boss"}
tmpl, err := template.New("test").Parse("{{.SayHello}}\n{{.SayYouName .Name}}\n")
if err != nil {
panic(err)
}
err = tmpl.Execute(os.Stdout, mine)
if err != nil {
panic(err)
}
// out:
// hello world
// my name is : boss
}
8. 文本和空格
空白符:空格,水平制表符,回车符和换行符。
默认情况下,在执行模板时,动作之间的所有文本都会逐字复制。
* 在左分隔符 “{{” 后面紧跟着一个减号和ASCII空格字符 “{{- “,则紧接在文本之前所有尾随空白符都将删除。
* 在右分隔符 “}}” 前面有空格和减号” -}}”,则紧随其后的文本所有前导空格都将删除。
"{{23 -}} < {{- 45}}"
# 生成的输出将是
"23<45"