Go的模板动作就是嵌入模板的命令
条件动作
{{ if arg }}
some content
{{ else }}
other content
{{ end }}
迭代动作
迭代动作可以对数组,切片,映射,或者通道进行迭代, 在迭代循环内部, 点(.) 会被设置正在当前迭代内容
设置动作
设置动作允许为指定的范围的点(.) 设置指定的值。减少重复代码
包含动作
包含动作(include action)允许用户在一个模板里面包含另一个模板,从而构建出嵌套的模板。
包含动作的格式为{{ template “name” arg }},其中name参数为被包含模板的名字。没有特别指定名称时,就是文件名, arg 是参数名
参数、变量和管道
-
参数
一个参数(argument)就是模板中的一个值。它可以是布尔值、整数、字符串等字面量,也可以是结构、结构中的一个字段或者数组中的一个键。除此之外,参数还可以是一个变量、一个方法(这个方法必须只返回一个值,或者只返回一个值和一个错误)或者一个函数。最后,参数也可以是一个点(.),用于表示处理器向模板引擎传递的数据。 -
变量
除了参数之外,用户还可以在动作中设置变量。变量以美元符号($)开头,就像这样:
在这个例子中,点(.)是一个映射,而动作range在迭代这个映射的时候,会将变量$key和$value分别初始化为当前被迭代映射元素的键和值。 -
管道
模板中的管道(pipeline)是多个有序地串联起来的参数、函数和方法,它的工作方式和语法跟Unix的管道也非常相似:
{{p1 | p2 | p3}}
这里的p1,p2和p3可以是参数或者函数。
管道允许用户将一个参数的输出传递给下一个参数,而各个参数之间则使用 | 分隔。
函数
Go的模板引擎函数都是受限制的:尽管这些函数可以接受任意多个参数作为输入,但它们只能返回一个值,或者返回一个值和一个错误。
为了创建一个自定义模板函数,需要:
- 创建一个名为FuncMap的映射,并将映射的键设置为函数的名字,而映射的值则设置为实际定义的函数
- 将FuncMap 与模板绑定
示例:
package main
import (
"fmt"
"html/template"
"net/http"
"time"
)
func main(){
server := http.Server{
Addr: "127.0.0.1:8080",
}
http.HandleFunc("/testFuncMap", testFuncMap)
server.ListenAndServe()
}
func testFuncMap(w http.ResponseWriter, re *http.Request) {
funcMap := template.FuncMap{
"fdate": formatDate,
}
t := template.New("testFuncMap.tmpl").Funcs(funcMap)
// 前后模板的名字必须相同
t, err := t.ParseFiles("./testFuncMap.tmpl")
if err != nil {
fmt.Println(err)
return
}
err = t.Execute(w,time.Now())
if err != nil {
fmt.Println(err)
return
}
}
func formatDate(t time.Time) string{
layout := "2006-01-02"
return t.Format(layout)
}
- 模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
the date/time is {{. | fdate}}
</body>
</html>
- 结果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
the date/time is 2021-11-08
</body>
</html>