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等静态资源
相关推荐
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_58:(构建行星数据表——HTML表格高级实战指南)
前端·javascript·ui·html·音视频
栉甜1 小时前
APIs学习
前端·javascript·css·学习·html
Dxy12393102162 小时前
HTML的Iframe详解
前端·html
ZC跨境爬虫3 小时前
跟着 MDN 学 HTML day_60:(表单与按钮技能测试实战)
服务器·前端·javascript·数据库·ui·html
2601_958492553 小时前
A Technical Log: Hosting Gravity Dunk - HTML5 Casual game
前端·html·html5
会编程的土豆4 小时前
Gin 核心概念 & 前后端交互笔记
笔记·交互·gin
ZHOUPUYU4 小时前
PHP8高性能Web开发实战指南
后端·html·php
LaughingZhu4 小时前
Product Hunt 每日热榜 | 2026-05-17
前端·人工智能·chatgpt·html
2601_958492554 小时前
Behavioral Analysis of HTML5 Trivia Integration
前端·html·html5