1. 简单应用

  • Gin 支持 HTML 模板,然后将参数渲染到模板页面并返回,本质上是对页面内容进行字符串替换

  • 可以使用 LoadHTMLGlob(pattern string) 方法加载模板文件

    g := gin.Default()
    g.LoadHTMLGlob("template/**/*")
    

1.1 单目录结构

  • 目录结构如下
|- template
   |- index.html
|- main.go
  • main.go 代码:
func main() {
    g := gin.Default()
    // 加载 template 目录下的模板文件
    g.LoadHTMLGlob("template/*")
    g.GET("/index", func(ctx *gin.Context) {
        ctx.HTML(http.StatusOK, "index.html", gin.H{
            "title": "HTML 模板渲染样例",
            "body": "这里是内容",
        })
    })
    g.Run()
}
  • template/index.html 代码:
<!DOCTYPE html>
<html lang="en">
<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>{{ .title }}</title>
    <!-- 会被替换成以下注释中的内容 -->
    <!-- <title>HTML 模板渲染样例</title> -->
</head>
    <body>
        {{ .body }}
    	<!-- 会被替换成以下注释中的内容 -->
        <!-- 这里是内容 -->
    </body>
</html>

1.2 多级目录结构

  • 目录结构如下
|- template
   |- user
      |- index.html
|- main.go
  • main.go 代码:
func main() {
    g := gin.Default()
    // 加载 template 目录下的模板文件
    g.LoadHTMLGlob("template/**/*")
    g.GET("/index", func(ctx *gin.Context) {
        ctx.HTML(http.StatusOK, "user/index.html", gin.H{
            "title": "HTML 模板渲染样例",
            "body": "这里是内容",
        })
    })
    g.Run()
}
  • template/user/index.html 代码:
{{ define "user/index.html" }}
<!DOCTYPE html>
<html lang="en">
<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>{{ .title }}</title>
    <!-- 会被替换成以下注释中的内容 -->
    <!-- <title>HTML 模板渲染样例</title> -->
</head>
<body>
	{{ .body }}
	<!-- 会被替换成以下注释中的内容 -->
	<!-- 这里是内容 -->
</body>
</html>
{{ end }}

2. 模板复用

  • 目录结构如下:
|- static
|- template
   |- public
      |- footer.html
      |- header.html
   |- user
      |- index.html
|- main.go
  • main.go 代码:
func main() {
    g := gin.Default()
    // 加载 template 目录下的模板文件
    g.LoadHTMLGlob("template/**/*")
    g.GET("/index", func(ctx *gin.Context) {
        ctx.HTML(http.StatusOK, "user/index.html", gin.H{
            "title": "HTML 模板渲染样例",
            "body": "这里是内容",
        })
    })
    g.Run()
}
  • user/index.html 代码:
{{ define "user/index.html" }}
<!DOCTYPE html>
<html lang="en">
{{ template "public/header" . }}
{{ template "public/footer" . }}
</html>
{{ end }}
  • public/header.html 代码:
{{ define "public/header" }}
<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>{{ .title }}</title>
    <!-- 会被替换成以下注释中的内容 -->
    <!-- <title>HTML 模板渲染样例</title> -->
</head>
{{ end }}
  • public/footer.html 代码:
{{ define "public/footer" }}
<body>
	{{ .body }}
	<!-- 会被替换成以下注释中的内容 -->
	<!-- 这里是内容 -->
</body>
{{ end }}

3. 静态资源文件映射

  • 可以使用 Static(uriPath, rootPath string) 方法配置静态资源文件目录
g.Static("/static", "./static")