本篇文章讲解下模板更深入的一些用法,比如:条件语句、函数、循环语句等。

一、条件语句

条件语句通常的语法格式如下:

{{ 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 产生的值;

五、参考链接