go语言的模板引擎
text/template:文本模板引擎
html/template:HTML文档
作用:
- 模板文件后缀:通常为.tmpl和.tpl(也可以是其他的),必须是UTF编码
- 模板文件中使用{{}}包裹和标识需要传入数据
- 传给模板的数据可用(.)来访问,如果数据复杂,可以通过{{.FieldName}}来访问它的字段。
- 除{{}}包裹的内容外,其他内容均不做修改原样输出。
解析模板文件
func (t *Template) Parse(src string) (*Template, error)//从字符串中解析一个模板
func ParseFiles(filenames ...string) (*Template, error)//根据文件名中解析一个模板
func ParseGlob(pattern string) (*Template, error)//从正则匹配规则解析模板
渲染:使用数据去填充模板
func (t *Template) Execute(wr io.Writer, data interface{}) error
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
1传递字符串
示例
package main
import (
"fmt"
"html/template"
"net/http"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
// 解析指定文件生成模板对象
tmpl, err := template.ParseFiles("./hello.tmpl")
if err != nil {
fmt.Println("create template failed, err:", err)
return
}
// 利用给定数据渲染模板,并将结果写入w
tmpl.Execute(w, "沙河小王子")
}
func main() {
http.HandleFunc("/hello", sayHello)
err := http.ListenAndServe(":9090", nil)
if err != nil {
fmt.Println("HTTP server failed,err:", err)
return
}
}
编译运行后在网页打开
2传递结构体
定义模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello</title>
</head>
<body>
<p>姓名 {{ .Name }}</p>
<p>年龄 {{ .Age }}</p>
<p>性别 {{ .Gender }}</p>
</body>
</html>
解析模板+渲染模板
//定义struct
type User struct {
Name string //首字母大写,才能被调用,小写是不能被调用的
Gender string
Age int
}
func sayHello2(w http.ResponseWriter, r *http.Request) {
//定义模板 hello.tmpl
//解析模板
tmpl, err := template.ParseFiles("./hello.tmpl")
if err != nil {
fmt.Println("err:", err)
}
//渲染模板
//结构体初始化
u1 := User{
Name: "小王子1",
Gender: "男",
Age: 18,
}
tmpl.Execute(w, u1)
}
编译运行后在网页打开
3传递多数据源
本例为struct+map 其他类似
定义模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello</title>
</head>
<body>
<p>struct</p>
<p>姓名 {{ .u1.Name }}</p>
<p>年龄 {{ .u1.Age }}</p>
<p>性别 {{ .u1.Gender }}</p>
<p>map</p>
<p>姓名 {{ .m1.name }}</p>
<p>年龄 {{ .m1.age }}</p>
<p>性别 {{ .m1.gender }}</p>
</body>
</html>
解析模板+渲染模板
//多数据源
func sayHelloMapStruct(w http.ResponseWriter, r *http.Request) {
//定义模板 hello.tmpl
//解析模板
tmpl, err := template.ParseFiles("./hello.tmpl")
if err != nil {
fmt.Println("err:", err)
}
//渲染模板
//map初始化 map是通过key访问,key不需要大写
m1 := map[string]interface{}{
"name": "小王子map",
"gender": "男",
"age": 18,
}
//结构体初始化
u1 := User{
Name: "小王子struct",
Gender: "男",
Age: 18,
}
//模板渲染的数据源是第二个参数,所以前端 <p>性别 {{ .m1.gender }}</p>
tmpl.Execute(w, map[string]interface{}{
"u1": u1,
"m1": m1,
})
}
编译运行后在网页打开
所有博客均为自己学习的笔记。如有错误敬请理解。