在Gin框架模板中使用 {{ }} 括号进行变量渲染,那么它自带有一些语法用法。
一、上下文
- . 访问当前位置的上下文
- $ 引用当前模板根级的上下文
- $. 引用模板中的根级上下文
后台:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func Index(ctx *gin.Context) { // 上下文 map_data := map[string]interface{}{ "arr_num": [3]int{1, 2, 3}, "name": "lily", } ctx.HTML(http.StatusOK, "index.html", map_data) } func main() { router := gin.Default() // 加载模板 router.LoadHTMLGlob("template/*") router.GET("/index", Index) router.Run(":8080") }
前台:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{.}} {{/*这里的 . 表示后台的传递的map_data变量数据*/}} {{range $i, $v := .arr_num}} {{/*这里的 .arr_num 表示后台的传递的map_data.arr_num变量数据*/}} {{$v}} {{/*$i, $v作用域是在数组的范围内,表示的是循环的每一个值,但是如果*/}} {{$.name}} {{/*如果想在循环内使用map_data的name数据,就需要使用 $. 了,表示map_data.name*/}} {{end}} </body> </html>
二、模板符号
- 字符串:{ { “abc” } }
- 字节类型:{ { ' a' } } -->97
- 原始字符串:{ { `a` } } 不会转义
- nil类型:{ { print nil } } { {nil } }只有nil会报错:nil is not a command
三、变量的定义与使用
- 定义
{{ $age := 18 }}
- 使用
{{ $age }}
四、pipline
可以是上下文的变量输出,也可以是函数通过管道传递的返回值,如:
- { {.Name} } 是上下文的变量输出,是个pipline
- { { "abc" | len } } 是函数通过管道传递的返回值,是个pipline
五、if条件语句
- if...else...
- if嵌套
后台:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func Index1(ctx *gin.Context) { // 上下文 map_data := map[string]interface{}{ "arr_num": [3]int{1, 2, 3}, "name": "lily", } ctx.HTML(http.StatusOK, "index1.html", map_data) } func main() { router := gin.Default() // 加载模板 router.LoadHTMLGlob("template/*") // 模板语法if条件 router.GET("/index1", Index1) router.Run(":8080") }
前台:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{/*if...else...*/}} {{if .name}} <p>name存在:{{$.name}}</p> {{else}} <p>name不存在</p> {{end}} <br>
{{/*if嵌套*/}} {{if .name}} {{if eq $.name "lily"}} <p>name正确:{{$.name}}</p> {{else}} <p>name不正确</p> {{end}} {{else}} <p>name不存在</p> {{end}} </body> </html>
六、range
- 普通用法
{{/*方法一*/}} {{range $i, $v := .arr_num}} {{$v}} {{end}} {{/*方法二*/}} {{range .arr_num }} {{.}} {{/*表示的是每一个循环值*/}} {{end}}
- else用法
range也支持else,当被range的数据长度为0时,执行else
{{/*range...else...*/}} {{range .arr_num}} {{.}} {{else}} {{0}} {{/*当.arr_num长度为0时,执行else*/}} {{end}}
七、with的使用
- 一般方式
with可用于重定向 pipeline,比如后台:
func Index3(ctx *gin.Context) { // 上下文 user_data := User{ Name: "alice", Age: 18, } message := "success" data := map[string]interface{} { "user_data": user_data, "message": message, } ctx.HTML(http.StatusOK, "index3.html", data) }
那么在前台取出 user_data 中的值:
{{/*一般方式*/}} {{.user_data.Name}} {{.user_data.Age}}
显然每次都需要使用 .user_data 更简单的方式是:
{{/*with方式*/}} {{with .user_data}} {{.Name}} {{.Age}} {{end}}
- else方式
这种方式和range的else差不多:
{{/*with else方式*/}} {{with .user_data}} {{.Name}} {{.Age}} {{else}} <p>无数据</p> {{end}}
八、template
它的作用是引入另一个模板文件,进行模板嵌套。语法:{ {template "模板名" pipeline} },如 {{template "base.html" .}}
- 后台
func Index4(ctx *gin.Context) { message := "Hello World!" ctx.HTML(http.StatusOK, "index4.html", message) }
- 前台
index4.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{template "base.html" .}} </body> </html>
base.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{.}} </body> </html>
九、项目结构
└─模板语法
│ main.go
│ README.md
│
└─template
base.html
index.html
index1.html
index2.html
index3.html
index4.html