在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