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等静态资源
相关推荐
shandianchengzi2 小时前
【开源工具】我做了一个周深歌曲淘汰赛生成器:挑选 128 首歌 PK,选出你的年度 TOP1
html·音乐·网页·世界杯
触底反弹11 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
两点王爷21 小时前
一个快速加载面和多面数据的html测试页面(可以导出geojson数据文件)
前端·html·gis
杨超越luckly1 天前
Agent应用指南:长三角41城跨城人口流动OD数据分析
python·数据挖掘·数据分析·html·可视化
不好听6131 天前
HTML 事件监听机制:从 DOM Level 0 到 React 合成事件
前端·react.js·html
xcLeigh2 天前
Doubao-Seed-Evolving大模型接入教程|搭建全品类提示词+AI工具导航网页
前端·人工智能·python·ai·html·ai开发·豆包
2301_794461572 天前
JavaScript 基础知识点详解
前端·javascript·html
门前大桥下.2 天前
HTML-01我的第一个网页
前端·html
datagear2 天前
DataGear 6.0.0 新特性之本地图表
数据分析·html·数据可视化