本篇文章讲解下模板更深入的一些用法,比如:条件语句、函数、循环语句等。
一、条件语句
条件语句通常的语法格式如下:
{{ if pipeline }} expression0 {{ end }}
{{ if pipeline }} expression0 {{ else }} expression1 {{ end }}
{{ if pipeline }} expression0 {{ else if pipeline }} expression1 {{ end }}
当然,还可以使用更复杂的嵌套形式。 其中,pipeline 中的判断语法有如下几种:
eq,ne,lt ,le,gt,ge ,看下面的例子:
import (
"os"
"text/template"
)
type student struct {
Name string
Like string
}
func main() {
Joy := student{"Joy", "Ping pong"}
strTemplate := "My name is {{.Name}} and I like to play {{if eq .Like `Ping pong`}}{{.Like}}{{else}}Basketball{{end}}!\n" // (1)定义模板-固定不变
templ, err := template.New("templateOne").Parse(strTemplate) // (2)解析模板
if err != nil {
panic(err)
}
err = templ.Execute(os.Stdout, Joy) //(3)数据驱动模板,将name的值填充到模板中
if err != nil {
panic(err)
}
}
输出为:
My name is Joy and I like to play Ping pong!
在例子中,if 语句根据判断.Like的值与“Ping Pong”的结构执行,逻辑和普通的 if / else 语句相同,只是判断方式不同。
二、循环语句
循环语句的语法格式如下:
{{ range pipeline }} expression {{ end }}
pipeline 需要是数组、切片、字典和通道中的一种,即可迭代类型的值,看下面的例子:
import (
"os"
"text/template"
)
type student struct {
Name string
Like string
}
func main() {
var students []student
students = append(students, student{"Joy", "Ping pong"})
students = append(students, student{"Bob", "Basketball"})
strTemplate := "{{range .}}My name is {{.Name}} and I like to play {{.Like}}!\n{{end}}" // (1)定义模板-固定不变
templ, err := template.New("templateOne").Parse(strTemplate) // (2)解析模板
if err != nil {
panic(err)
}
err = templ.Execute(os.Stdout, students) //(3)数据驱动模板,将name的值填充到模板中
if err != nil {
panic(err)
}
}
输出为:
My name is Joy and I like to play Ping pong!
My name is Bob and I like to play Basketball!
三、函数
模板中调用函数的模板如下:
{{functionName [Argument...]}}
参数可以是零个或多个,看下面的例子:
import (
"os"
"text/template"
)
type student struct {
Name string
Like string
}
// Judge 判断
func Judge(like string) string {
if like == "Ping pong" {
return "Basketball"
}
return like
}
func main() {
Joy := student{"Joy", "Ping pong"}
strTemplate := "My name is {{.Name}} and I like to play {{Judge .Like}}!\n" // (1)定义模板-固定不变
templ, err := template.New("templateName").Funcs(template.FuncMap{"Judge": Judge}).Parse(strTemplate) // (2)解析模板
if err != nil {
panic(err)
}
err = templ.Execute(os.Stdout, Joy) //(3)数据驱动模板,将name的值填充到模板中
if err != nil {
panic(err)
}
}
输出为:
My name is Joy and I like to play Basketball!
四、其它常用语法
4.1 裁剪空格
可以将 “-” 放在输出内容的前后来去掉空格;
{{- content -}} :消除 content 前后的空格;
{{- content }} :消除 content 前的空格;
{{ content -}} :消除 content 后的空格;
4.2 注释
{{/*comment*/}} :注释
4.3 调用模板
{{template "name"}} : 执行名称为 name 的模板,不传递数据;
{{template "name" pipeline}} :执行名称为 name 的模板,传递 pipeline 产生的值;