Gin框架系列之模板語法


在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM