> 文章列表 > go进阶篇gin框架系列三

go进阶篇gin框架系列三

go进阶篇gin框架系列三

一、模板引擎的语法

{{.}}

模板语法都包含在{{}}中间,其中{{.}}中的点表示当前对象。

当我们传入一个结构体对象时,我们可以根据.来访问结构体的对应字段。

pipeline

pipeline是指产生数据的操作。比如{{.}}{{.Name}}等。Go的模板语法中支持使用管道符号|链接多个命令,用法和unix下的管道类似:|前面的命令会将运算结果(或返回值)传递给后一个命令的最后一个位置。

注意:并不是只有使用了|才是pipeline。Go的模板语法中,pipeline的概念是传递数据,只要能产生数据的,都是pipeline

变量

我们还可以在模板中声明变量,用来保存传入模板的数据或其他语句生成的结果。

例如:其中$obj是变量的名字

$obj := {{.}}

移除空格

有时候我们在使用模板语法的时候会不可避免的引入一下空格或者换行符,这样模板最终渲染出来的内容可能就和我们想的不一样,这个时候可以使用{{-语法去除模板内容左侧的所有空白符号, 使用-}}去除模板内容右侧的所有空白符号。

例如:-要紧挨{{}},同时与模板值之间需要使用空格分隔

{{- .Name -}}

条件判断

{{if pipeline}} T1 {{end}}{{if pipeline}} T1 {{else}} T0 {{end}}{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}

range

Go的模板语法中使用range关键字进行遍历,有以下两种写法,其中pipeline的值必须是数组、切片、字典或者通道。

{{range pipeline}} T1 {{end}}
如果pipeline的值其长度为0,不会有任何输出{{range pipeline}} T1 {{else}} T0 {{end}}
如果pipeline的值其长度为0,则会执行T0。

二、实战

2.1 模板语法

package mainimport ("fmt""html/template""net/http"
)/**
go 模板语法
*/
func main() {http.HandleFunc("/user", speak)err := http.ListenAndServe(":8082", nil)if err != nil {fmt.Println("启动失败", err)return}}func speak(w http.ResponseWriter, r *http.Request) {// 定义模板// 解析模板t, err := template.ParseFiles("../go_04.tmpl")if err != nil {fmt.Println("读取文件失败,err:", err)return}// 渲染模板//str := "钟渊学习go"u1 := User{Name:   "tom",gender: "男",Age:    18,}fmt.Println(u1)m1 := map[string]interface{}{"name": "李明","age":  20,}hobbyList := []string{"篮球","足球","乒乓球",}t.Execute(w, map[string]interface{}{"u1":    u1,"m1":    m1,"hobby": hobbyList,})}type User struct {Name   stringgender stringAge    int
}
go_04.tmpl文件
<!DOCTYPE html>
<html lang="zh-CN">
<head><title>模板引擎语法练习</title>
</head>
<body>
<p>u1</p><div>{{ .u1 }}</div>
<p>m1</p>
<div>{{ .m1 }}</div><hr/>{{$v1 :=100}}
<hr/>
{{ if $v1}}
{{$v1}}
{{else}}
没有数据
{{end}}<hr>
{{.hobby}}
<hr>{{range $index,$h :=.hobby}}
<p>{{$index }} -{{$h}}</p>
{{end}}
</body>
</html>

   效果展示

 

2.2 模板嵌套

package mainimport ("fmt""html/template""net/http"
)/**
自定义函数
*/
func main() {http.HandleFunc("/user", f5)http.HandleFunc("/temp", temp)err := http.ListenAndServe(":8083", nil)if err != nil {fmt.Println("启动失败", err)return}}func f5(w http.ResponseWriter, r *http.Request) {// 自定义一个函数speak := func(name string) (string, error) {return name + "说他喜欢go语言", nil}//定义模板// 解析模板t := template.New("f5.tmpl")t.Funcs(template.FuncMap{"speak": speak,})_, err := t.ParseFiles("../f5.tmpl")if err != nil {fmt.Println("解析模板失败", err)}//渲染模板str := "钟渊"t.Execute(w, str)
}func temp(w http.ResponseWriter, r *http.Request) {// 定义模板// 解析模板t, err := template.ParseFiles("../t.tmpl", "../ul.tmpl")if err != nil {fmt.Println("解析模板失败", err)return}// 渲染模板str := "钟渊"t.Execute(w, str)}
f5.tmpl文件
<!DOCTYPE html>
<html lang="zh-CN">
<head><title>自定义模板</title>
</head>
<body>
<p>u1</p>
<div>{{speak .}}</div>
</body>
</html>
t.tmpl文件
<!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>tmpl test</title>
</head>
<body><p>{{.}} 学习嵌套template语法</p><h1>测试嵌套template语法</h1><hr>{{template "ul.tmpl"}}<hr>{{template "ol.tmpl"}}
</body>
</html>{{ define "ol.tmpl"}}
<ol><li>吃饭</li><li>睡觉</li><li>打豆豆</li>
</ol>
{{end}}
ul.tmpl文件
<ul><li>注释</li><li>日志</li><li>测试</li>
</ul>

效果展示