【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 框架中,模板引擎的配置通过以下步骤完成:

  1. 加载模板文件。
  2. 在路由中使用 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>
模板语法说明
  1. {{ .变量名 }}:用于输出变量值。
  2. 模板中的 .变量名 对应 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,
})

IsAdmintrue 时,显示“欢迎,管理员!”。


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 应用开发技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473751.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建vue3项目步骤

脚手架创建项目&#xff1a; pnpm create vue Cd 项目名称安装依赖&#xff1a;Pnpm iPnpm Lint&#xff1a;修复所有文件风格 &#xff0c;不然eslint语法警告报错要双引号Pnpm dev启动项目 拦截错误代码提交到git仓库&#xff1a;提交前做代码检查 pnpm dlx husky-in…

【爬虫实战】抓取某站评论

【爬虫实战】抓取某站评论 声明&#xff1a;本文中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 方式一&#xff1a;JS逆向request发…

OpenSSL 自签名

参考文档&#xff1a;unigui开发人员工作手册2021 参考文章&#xff1a;保姆级OpenSSL下载及安装教程-CSDN博客 下载 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 进入后向下拉找到下载位置&#xff0c;建议下载二进制版本的精简版&#xff0c…

基于YOLOv8深度学习的公共卫生防护口罩佩戴检测系统(PyQt5界面+数据集+训练代码)

在全球公共卫生事件频发的背景下&#xff0c;防护口罩佩戴检测成为保障公众健康和控制病毒传播的重要手段之一。特别是在人员密集的公共场所&#xff0c;例如医院、学校、公共交通工具等地&#xff0c;口罩的正确佩戴对降低病毒传播风险、保护易感人群、遏制疫情扩散有着至关重…

stm32下的ADC转换(江科协 HAL版)

十二. ADC采样 文章目录 十二. ADC采样12.1 ADC的采样原理12.2 STM32的采样基本过程1.引脚与GPIO端口的对应关系2.ADC规则组的四种转换模式(**)2.2 关于转换模式与配置之间的关系 12.3 ADC的时钟12.4 代码实现(ADC单通道 & ADC多通道)1. 单通道采样2. 多通道采样 19.ADC模数…

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前&#xff0c;需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置&#xff0c;如下图所示 2.输入你想扩展的磁盘容量&#xff0c;以本次实操为例&#xff0c;我这里输入的30G&#xff08;具体按照实…

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行&#xff0c;mentor给的是一个rosbag格式的数据包&#xff0c;配置过程出了几个问题记录一下&#xff0c;沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…

STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 本系统基于STM32微控制器和Zigbee无线通信技术&#xff0c;设计了…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

Python绘制雪花

文章目录 系列目录写在前面技术需求完整代码代码分析1. 代码初始化部分分析2. 雪花绘制核心逻辑分析3. 窗口保持部分分析4. 美学与几何特点总结 写在后面 系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4…

第六节、Docker 方式部署指南 github 上项目 mkdocs-material

一、简介 MkDocs 可以同时编译多个 markdown 文件,形成书籍一样的文件。有多种主题供你选择,很适合项目使用。 MkDocs 是快速,简单和华丽的静态网站生成器,可以构建项目文档。文档源文件在 Markdown 编写,使用单个 YAML 配置文件配置。 MkDocs—markdown项目文档工具,…

Spring Boot教程之Spring Boot简介

Spring Boot 简介 接下来一段时间&#xff0c;我会持续发布并完成Spring Boot教程 Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序&#xff0c;Spring 提供了 Spring MVC&#xff0c;它是 Spring 的一个广泛使用的模块&#xff0c;用于创建可扩展的 Web 应用程序。…

无线迷踪:陈欣的网络之旅

第一章 陈欣是一名资深的网络工程师&#xff0c;工作在一家领先的科技公司。她的生活平静而有序&#xff0c;直到有一天&#xff0c;公司的无线网络突然出现了严重的问题。员工们的设备频繁断开连接&#xff0c;无法正常使用。这个问题不仅影响了工作效率&#xff0c;还引起了…

ssm129办公用品管理系统开发与设计+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;办公用品管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本办公用品管理系统…

OMV7 树莓派 tf卡安装

​ 升级7之后&#xff0c;问题多多&#xff0c;不是docker不行了&#xff0c;就是代理不好使 今天又重装了一遍&#xff0c;用官方的链接&#xff0c;重新再折腾一遍…… 使用raspberry pi imager安装最新版lite OS。 注意是无桌面 Lite版 配置好树莓派初始化设置&#xff0…

【数据结构与算法】查找

文章目录 一.查找二.线性结构的查找2.1顺序查找2.2折半查找2.3分块查找 三.树型结构的查找3.1二叉排序树1.定义2.二叉排序树的常见操作3.性能分析 3.2平衡二叉树1.定义2.平衡二叉树的常见操作3.性能分析 3.3B树1.定义2.B树的相关操作 3.4B树1.定义2.B树与B树的比较 四.散列表1.…

SpringCloud篇(服务保护 - Sentinel)

目录 一、雪崩问题及解决方案 1. 雪崩问题 2. 解决方案 方案一&#xff1a;超时处理 方案二&#xff1a;仓壁模式 方案三&#xff1a;断路器模式 方案四&#xff1a;限流 3. 总结 二、服务保护技术对比 三、Sentinel介绍与安装 1. 初识Sentinel 2. Sentinel 优势 3…

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因&#xff0c;我的东西最终需要跑在amd64上&#xff0c;但是因为mac的架构师arm64&#xff0c;所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构&#xff1a; docker inspect 8135f475e221 | grep Arc…