Gin c.HTML 完整教程

c.HTML() 是 Gin 渲染 HTML 模板 的核心方法,必须配合 LoadHTMLGlob/LoadHTMLFiles 使用,专门用来把后端数据注入到 HTML 页面。

一、核心语法

go 复制代码
c.HTML(httpCode int, tmplName string, data any)
  • httpCode:状态码,一般填 200
  • tmplName:模板文件名(不是路径!)
  • data:传给模板的数据,常用 gin.H{} 字典

二、完整最小示例

1. 目录结构

复制代码
project/
├── main.go
└── templates/
    └── index.html

2. main.go

go 复制代码
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()

	// 1. 加载所有HTML模板(必须写在c.HTML之前)
	r.LoadHTMLGlob("templates/*")

	// 2. 路由渲染页面
	r.GET("/", func(c *gin.Context) {
		// 渲染 index.html,传数据
		c.HTML(http.StatusOK, "index.html", gin.H{
			"Title": "Gin c.HTML教程",
			"Msg":   "后端传过来的消息",
			"Num":   666,
		})
	})

	r.Run(":8080")
}

3. templates/index.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <h1>{{.Msg}}</h1>
    <p>数字:{{.Num}}</p>
</body>
</html>

运行访问 http://localhost:8080,数据就渲染出来了。


三、关键知识点

1. LoadHTMLGlob 路径规则

  • templates/*:只加载一级目录
  • templates/**/*:加载所有子目录(推荐)
go 复制代码
r.LoadHTMLGlob("templates/**/*")

2. 子目录模板怎么渲染?

目录:

复制代码
templates/
    index.html
    admin/
        dash.html

渲染:

go 复制代码
c.HTML(200, "admin/dash.html", gin.H{})

3. 数据传递高级用法

传切片/数组

go 复制代码
c.HTML(200, "index.html", gin.H{
	"List": []string{"苹果", "香蕉", "橙子"},
})

html 循环:

html 复制代码
{{range .List}}
    <li>{{.}}</li>
{{end}}

传结构体

go 复制代码
type User struct {
	Name string
	Age  int
}

c.HTML(200, "index.html", gin.H{
	"User": User{"张三", 20},
})

html:

html 复制代码
<p>姓名:{{.User.Name}}</p>
<p>年龄:{{.User.Age}}</p>

四、模板继承(layout 布局,重点)

实际项目都用母版页,避免每个页面重复写 html/head/body。

目录

复制代码
templates/
    layout.html   # 母版
    home.html     # 子页面

layout.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <header>公共头部</header>
    {{template "content" .}}  <!-- 子页面占位 -->
    <footer>公共底部</footer>
</body>
</html>

home.html

html 复制代码
{{define "content"}}
    <h1>我是首页内容</h1>
    <p>{{.Msg}}</p>
{{end}}

main.go

go 复制代码
r.LoadHTMLGlob("templates/*")

r.GET("/home", func(c *gin.Context) {
	c.HTML(200, "layout.html", gin.H{
		"Title": "首页",
		"Msg":   "hello gin",
	})
})

五、静态资源搭配(CSS/JS/图片)

c.HTML 只管页面渲染,静态文件必须用 r.Static

go 复制代码
// 托管静态资源
r.Static("/static", "./static")

html 中使用:

html 复制代码
<link rel="stylesheet" href="/static/css/style.css">
<script src="/static/js/main.js"></script>

六、常见错误&避坑

  1. 找不到模板
    原因:LoadHTMLGlob 路径不对,必须相对运行命令的目录
  2. 子页面渲染不出来
    用 r.LoadHTMLGlob("templates/**/*")
  3. 变量不显示
    模板语法是 {``{.变量名}},不能少点
  4. 纯静态html
    不用 c.HTML,直接用 r.Static

七、一句话总结

  • LoadHTMLGlob:加载模板文件
  • c.HTML:渲染模板 + 注入后端数据
  • r.Static:提供css/js/img等静态资源
相关推荐
用户298698530141 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
程序员大阳2 天前
HTML+CSS+JS对话式实战(3)-活动管理页实现查询、新增、删除API后端接口
javascript·css·html·实战·删除·查询·新增
htzyl2065 天前
前端阶梯——第四十三章、实战二:待办清单To-Do
前端·javascript·html
程序员大阳5 天前
HTML+CSS+JS对话式实战(1)-开篇:认识我们要做的社团活动发布平台
javascript·css·html·实战·系统·平台·社团活动发布
一支蜉蝣5 天前
Day26 XD安全学习笔记--PHP 应用&模版引用&Smarty渲染&MVC 模型&数据联动&RCE 安全
笔记·网络安全·html·php
用户298698530145 天前
Python 将 Markdown 批量转为 HTML:单文件与目录遍历两种实现
python·html·markdown
钱栈up5 天前
热榜上手|HyperFrames:写HTML出MP4
前端·html
幸运小猿6 天前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
轻松西西莱尔6 天前
谷歌+斯坦福+CMU 等五家 203 页综述,我做了个HTML把主动式AI的边界跑给你看
前端·html·agent
皓月盈江6 天前
GO使用Gin框架实现模板定义、解析与渲染
linux·golang·go·gin·定义模板·解析模板·渲染模板