【Golang】——Gin 框架中的模板渲染详解
Gin 框架支持动态网页开发,能够通过模板渲染结合数据生成动态页面。在这篇文章中,我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据,并结合静态资源文件创建一个功能完整的动态网站。
文章目录
- 1. 什么是模板渲染?
- 1.1 概念介绍
- 1.2 Gin 中的模板渲染
- 2. Gin 模板渲染基础
- 2.1 配置模板引擎
- 示例代码
- 说明
- 2.2 创建模板文件
- 模板语法说明
- 2.3 使用 `LoadHTMLFiles` 方法
- 3. 模板渲染进阶
- 3.1 条件判断
- 示例模板
- 示例数据
- 3.2 循环处理
- 示例模板
- 示例数据
- 3.3 嵌套模板
- 基础模板 `layout.html`
- 子模板 `home.html`
- 渲染嵌套模板
- 4. 静态文件的处理
- 4.1 配置静态文件服务
- 4.2 在模板中引用静态文件
- 示例静态文件
- 5. 实战:简易博客项目
- 5.1 项目结构
- 5.2 完整代码
- 6. 总结

1. 什么是模板渲染?
1.1 概念介绍
模板渲染是一种动态生成 HTML 页面的技术。通过模板文件和动态数据的结合,Web 应用可以为每个用户生成不同的内容。模板渲染的主要作用包括:
- 数据与视图分离:HTML 文件专注于页面结构和样式,动态数据由代码逻辑控制。
- 代码复用:通过模板复用页面组件(如导航栏、页脚等)。
- 维护便利:HTML 和业务逻辑分开,降低了代码维护的复杂性。
1.2 Gin 中的模板渲染
Gin 使用 Go 标准库 html/template 提供模板功能。html/template 是一套基于 HTML 的安全模板引擎,避免了常见的跨站脚本攻击 (XSS)。
2. Gin 模板渲染基础
2.1 配置模板引擎
在 Gin 框架中,模板引擎的配置通过以下步骤完成:
- 加载模板文件。
- 在路由中使用
c.HTML()渲染模板。
示例代码
package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()// 1. 加载模板文件r.LoadHTMLGlob("templates/*")// 2. 定义路由r.GET("/", func(c *gin.Context) {c.HTML(200, "index.html", gin.H{"Title": "Gin 模板示例","Message": "欢迎来到 Gin 的世界!",})})// 3. 启动服务器r.Run(":8080")
}
说明
LoadHTMLGlob("templates/*"):加载templates文件夹下的所有.html文件。c.HTML(200, "index.html", gin.H{"key": "value"}):渲染模板,传递键值对形式的数据。
2.2 创建模板文件
在项目根目录下创建 templates/index.html 文件,内容如下:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{ .Title }}</title>
</head>
<body><h1>{{ .Message }}</h1>
</body>
</html>
模板语法说明
{{ .变量名 }}:用于输出变量值。- 模板中的
.变量名对应gin.H中的键。
运行程序后,访问 http://localhost:8080,浏览器将显示模板渲染的内容。
2.3 使用 LoadHTMLFiles 方法
LoadHTMLFiles 用于加载指定的模板文件,而不是整个目录:
r.LoadHTMLFiles("templates/index.html", "templates/about.html")
适用于模板文件较少且明确的情况。
3. 模板渲染进阶
Gin 模板渲染支持条件判断、循环、嵌套等功能。下面逐一讲解这些功能的实现方式。
3.1 条件判断
条件判断通过 {{ if }} 实现,可以搭配 {{ else }} 或 {{ else if }}。
示例模板
<h1>{{ .Title }}</h1>
{{ if .IsAdmin }}
<p>欢迎,管理员!</p>
{{ else }}
<p>欢迎,普通用户!</p>
{{ end }}
示例数据
c.HTML(200, "index.html", gin.H{"Title": "条件判断示例","IsAdmin": true,
})
当 IsAdmin 为 true 时,显示“欢迎,管理员!”。
3.2 循环处理
通过 {{ range }} 遍历数组或切片:
示例模板
<ul>{{ range .Items }}<li>{{ . }}</li>{{ end }}
</ul>
示例数据
c.HTML(200, "index.html", gin.H{"Items": []string{"苹果", "香蕉", "橙子"},
})
渲染结果为:
<ul><li>苹果</li><li>香蕉</li><li>橙子</li>
</ul>
3.3 嵌套模板
嵌套模板允许你将页面分为多个组件,例如公共的头部和尾部。
基础模板 layout.html
<!DOCTYPE html>
<html lang="en">
<head><title>{{ .Title }}</title>
</head>
<body><header>公共头部</header>{{ template "content" . }}<footer>公共尾部</footer>
</body>
</html>
子模板 home.html
{{ define "content" }}
<h1>{{ .Message }}</h1>
{{ end }}
渲染嵌套模板
r.GET("/", func(c *gin.Context) {c.HTML(200, "layout.html", gin.H{"Title": "嵌套模板示例","Message": "欢迎使用嵌套模板!",})
})
模板 layout.html 会自动嵌入子模板内容。
4. 静态文件的处理
4.1 配置静态文件服务
静态文件(如 CSS、JS、图片)通过 Static() 方法加载:
r.Static("/static", "./static")
此代码将项目中的 static 文件夹映射到 URL 路径 /static。
4.2 在模板中引用静态文件
<link rel="stylesheet" href="/static/style.css">
<script src="/static/app.js"></script>
示例静态文件
static/style.css:
body {font-family: Arial, sans-serif;background-color: #f5f5f5;
}

5. 实战:简易博客项目
5.1 项目结构
├── main.go
├── static
│ └── style.css
├── templates
│ ├── layout.html
│ ├── home.html
│ ├── post.html
5.2 完整代码
package mainimport ("github.com/gin-gonic/gin"
)type Post struct {ID intTitle stringContent string
}var posts = []Post{{1, "第一篇博客", "这是第一篇博客内容。"},{2, "第二篇博客", "这是第二篇博客内容。"},
}func main() {r := gin.Default()// 配置模板和静态文件r.LoadHTMLGlob("templates/*")r.Static("/static", "./static")// 首页路由r.GET("/", func(c *gin.Context) {c.HTML(200, "layout.html", gin.H{"Title": "首页","Posts": posts,})})// 文章详情路由r.GET("/post/:id", func(c *gin.Context) {id := c.Param("id")for _, post := range posts {if string(post.ID) == id {c.HTML(200, "layout.html", gin.H{"Title": post.Title,"Content": post.Content,})return}}c.String(404, "文章未找到")})r.Run(":8080")
}
运行后访问 http://localhost:8080,你将看到一个支持文章列表和详情页的简单博客。
6. 总结
本篇博客从模板渲染的基础配置,到嵌套模板、静态文件服务,以及完整项目实战,全面展示了 Gin 框架在动态网页开发中的强大能力。下一篇,我们将学习表单处理与数据绑定,进一步丰富你的 Web 应用开发技能。
相关文章:
【Golang】——Gin 框架中的模板渲染详解
Gin 框架支持动态网页开发,能够通过模板渲染结合数据生成动态页面。在这篇文章中,我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据,并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染?1.1 概…...
CSS:导航栏三角箭头
用CSS实现导航流程图的样式。可根据自己的需求进行修改,代码精略的写了一下。 注:场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅,自行处理。有个方法是直接在每个外面包一个DIV,用动态样式设置底色。 场景一、…...
onlyoffice Command service(命令服务)使用示例
一、说明 文档在这里:https://api.onlyoffice.com/docs/docs-api/additional-api/command-service/ 命令服务提供有几个简单的接口封装。也提供了前端和后端同时操作文档的可能。 二、正文 命令服务地址:https://documentserver/coauthoring/Com…...
QSS 设置bug
问题描述: 在QWidget上add 一个QLabel,但是死活不生效 原因: c 主程序如下: QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…...
交换排序——快速排序
交换排序——快速排序 7.7 交换排序——快速排序快速排序概念c语言的库函数qsort快速排序框架quickSort 7.7 交换排序——快速排序 快速排序概念 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法(下文简称快排),其基本思想为&a…...
nodejs入门(1):nodejs的前后端分离
一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的,当然,我肯定是很多年的计算机基础的,万变不离其宗。 现在web网站都流行所谓的前后端结构,不知不觉我也开始受到这个影响,以前都是前端直接操作…...
笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像
很简单的起因,我的东西最终需要跑在amd64上,但是因为mac的架构师arm64,所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构: docker inspect 8135f475e221 | grep Arc…...
gorm框架
连接 需要下载mysql的驱动 go get gorm.io/driver/mysql go get gorm.io/gorm 约定 主键:GORM 使用一个名为ID 的字段作为每个模型的默认主键。表名:默认情况下,GORM 将结构体名称转换为 snake_case 并为表名加上复数形式。 例如…...
免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制
Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。本文课题研究的“…...
【ASR技术】WhisperX安装使用
介绍 WhisperX 是一个开源的自动语音识别(ASR)项目,由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型,通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别(large-v2 为 70 倍实时…...
【计算机网络】协议定制
一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化,有现成的解决方案:①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数,根本就不是把数据发送到网络中!本质都是…...
【SQL】mysql常用命令
为方便查询,特整理MySQL常用命令。 约定:$后为Shell环境命令,>后为MySQL命令。 1 常用命令 第一步,连接数据库。 $ mysql -u root -p # 进入MySQL bin目录后执行,回车后输入密码连接。# 常用参数&…...
阿里云引领智算集群网络架构的新一轮变革
阿里云引领智算集群网络架构的新一轮变革 云布道师 11 月 8 日~ 10 日在江苏张家港召开的 CCF ChinaNet(即中国网络大会)上,众多院士、教授和业界技术领袖齐聚一堂,畅谈网络未来的发展方向,聚焦智算集群网络的创新变…...
几何合理的分片段感知的3D分子生成 FragGen - 评测
FragGen 来源于 2024 年 3 月 25 日 预印本的文章,文章题目是 Deep Geometry Handling and Fragment-wise Molecular 3D Graph Generation, 作者是 Odin Zhang,侯廷军,浙江大学药学院。FragGen 是一个基于分子片段的 3D 分子生成模…...
Python爬虫下载新闻,Flask展现新闻(2)
上篇讲了用Python从新闻网站上下载新闻,本篇讲用Flask展现新闻。关于Flask安装网上好多教程,不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图,页面简单,主要显示新闻标题。 分页,使用最简单的分页技术&…...
监控易监测对象及指标之:全面监控华为FusionInsight服务
随着大数据技术的广泛应用,华为FusionInsight以其卓越的性能和稳定性,成为了众多企业处理和分析海量数据的首选平台。然而,为了确保FusionInsight服务的持续稳定运行,对其进行全面监控至关重要。本文基于监控易工具,对…...
SQL面试题——蚂蚁SQL面试题 会话分组问题
会话分组问题 这里的分组不是简单的分组,而是会话的分组。 比如说,进入一个网站以后,可以连续的点击很多个页面,后台会记录用户的行为日志; 如果T日上午连续点击几个页面后退出了网站,直到第二天的下午才再次进入网站,单单从时间线上来看,昨天退出的那条日志跟今天进…...
nfs服务器--RHCE
一,简介 NFS(Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计 算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系…...
React--》如何高效管理前端环境变量:开发与生产环境配置详解
在前端开发中,如何让项目在不同环境下表现得更为灵活与高效,是每个开发者必须面对的挑战,从开发阶段的调试到生产环境的优化,环境变量配置无疑是其中的关键。 env配置文件:通常用于管理项目的环境变量,环境…...
Javascript高级—函数柯西化
函数柯西化(经典面试题) // 实现一个add方法,使计算结果能够满足如下预期: add(1)(2)(3) 6; add(1, 2, 3)(4) 10; add(1)(2)(3)(4)(5) 15;function add() {// 第一次执行时,定义一个数组专门用来存储所有的参数var…...
用STM32+NRF24L01模拟蓝牙广播,手机能搜到设备了!附完整代码
用STM32NRF24L01模拟蓝牙低功耗广播的实战指南 当我在实验室里第一次看到手机蓝牙搜索列表中出现自己用NRF24L01模块模拟的设备名称时,那种成就感至今难忘。这个看似简单的实验背后,其实隐藏着无线通信协议栈的巧妙设计。本文将带你从零开始,…...
无人机、自动驾驶如何搞定GNSS模糊度?快速固定技巧与RTKLib实战
无人机与自动驾驶中的GNSS模糊度快速固定:RTKLib实战指南 在动态环境中实现厘米级定位的关键,往往取决于GNSS信号中整周模糊度的快速准确固定。对于无人机飞控开发者而言,模糊度固定速度直接关系到飞行轨迹的平滑性;自动驾驶工程师…...
如何在Windows上轻松安装ViGEmBus虚拟手柄驱动解决游戏兼容性问题
如何在Windows上轻松安装ViGEmBus虚拟手柄驱动解决游戏兼容性问题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经遇到过这样的困扰:手…...
智能任务调度引擎:重构碧蓝航线自动化管理架构
智能任务调度引擎:重构碧蓝航线自动化管理架构 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 在移动游戏生命周…...
RFID电动车智能门禁管理系统技术采用四层架构设计,实现电动车智能化管理。感知层采用防水防撕RFID电子车牌;识别层配置3-4米远距离读卡器;控制层集成ARM7处理器;执行层通过电动道闸或摆闸或广告门
RFID电动车智能门禁管理系统技术方案一、系统架构概览层级设备/组件功能说明感知层RFID电子车牌(DDC-RFID)车辆身份标识,防水防撕带刀口识别层RFID读卡器一体机(DAIC-DDC-RFID)3-4米远距离识别,920-925MHz频…...
基于大语言模型的自动化数据标注:Autolabel实战指南
1. 项目概述:用大模型给数据打标签,这事儿到底靠不靠谱?如果你做过机器学习项目,尤其是监督学习,那你肯定对“数据标注”这四个字又爱又恨。爱的是,没有标注好的数据,模型就是无米之炊ÿ…...
DeepSeek Mesh可观测性体系构建:1个Prometheus+3类自定义指标+7类黄金信号告警模板(附YAML源码)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek Mesh可观测性体系全景概览 DeepSeek Mesh 是面向大规模 AI 模型推理服务的云原生服务网格,其可观测性体系并非简单叠加监控指标,而是围绕模型生命周期、推理链路与资源…...
城市级智慧停车平台建设思路:如何整合多个停车项目的数据
引言随着城市化进程的加速和机动车保有量的持续攀升,"停车难、停车乱"已经成为困扰各大城市的普遍性问题。根据公安部统计数据,截至2025年底,全国机动车保有量已突破4.5亿辆,而城市停车位缺口预计超过8000万个。与此同时…...
告别编译噩梦:在Ubuntu 22.04上为你的C++项目搞定Abseil依赖的三种方法
告别编译噩梦:在Ubuntu 22.04上为你的C项目搞定Abseil依赖的三种方法 在C项目的开发过程中,依赖管理一直是开发者面临的一大挑战。特别是对于现代C项目而言,如何高效、可靠地引入和管理第三方库,往往决定了项目的开发效率和最终质…...
后端开发必看:设计高并发系统时,如何估算你的RTT和时延带宽积?
高并发系统设计实战:从RTT到时延带宽积的性能优化指南 在分布式系统的世界里,网络性能指标往往成为制约整体吞吐量的隐形瓶颈。我曾亲眼见证过一个日活百万的社交平台,因为微服务间调用的RTT估算偏差,导致高峰期请求堆积如山的惨状…...
