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