【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.mzph.cn/diannao/60984.shtml

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

相关文章

力扣 LeetCode 144. 二叉树的前序遍历(Day6:二叉树)

解题思路&#xff1a; 方法一&#xff1a;递归&#xff08;中左右&#xff09; class Solution {List<Integer> res new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {recur(root);return res;}public void recur(TreeNode roo…

高级 SQL 技巧讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; SQL&#xff08;结构化查询语言&#xff09;是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理&#xff0c;掌握高级 SQL 技巧不仅能显著提高数据分析的效率&#xff0c;还能解决业务中的复…

pom中无法下载下来的类外部引用只给一个jar的时候

比如jar在桌面上放着,操作步骤如下&#xff1a; 选择桌面&#xff0c;输入cmd ,执行mvn install:install-file -DgroupIdcom -DartifactIdaspose-words -Dversion15.8.0 -Dpackagingjar -Dclassifierjdk11 -Dfilejar包名称 即可把jar包引入成功。

【软件测试】设计测试用例的万能公式

文章目录 概念设计测试用例的万能公式常规思考逆向思维发散性思维万能公式水杯测试弱网测试如何进行弱网测试 安装卸载测试 概念 什么是测试用例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为了实施测试⽽向被测试的系统提供的⼀组集合&#xff0c;这组集合包…

在连通无向图中寻找欧拉回路(Eulerian Circuit)

在连通无向图中寻找欧拉回路(Eulerian Circuit) 问题描述解决方案概述算法步骤伪代码C代码示例如何在迷宫中找出一条路示例:在简单迷宫中应用欧拉回路结论问题描述 给定一个连通无向图 $ G = (V, E) $,我们需要找到一条路径,该路径正向和反向通过 $ E $ 中的每条边恰好一…

ANSYS Maxwell:3PH 感应电机 - 第 1 部分 - 力与热耦合

在此博客中&#xff0c;我们使用 Ansys RMxprt 创建了 3PH 感应电机的 1D 模型&#xff0c;并从设计中自动开发具有所有设置、边界条件和激励的麦克斯韦模型。 ANSYS RMxprt 1D 模型 - 3PH 感应电机设计 请参阅上一篇博客下面的链接&#xff0c;了解如何设置电机设计的 RMxp…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

递归(二)---力扣22括号生成,力扣78求子集

22. 括号生成https://leetcode.cn/problems/generate-parentheses/ 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))&quo…

数据分布之指数分布(sample database classicmodels _No.10)

数据分布之指数分布&#xff08;sample database classicmodels _No.10&#xff09; 准备工作&#xff0c;可以去下载 classicmodels 数据库具体如下 点击&#xff1a;classicmodels 也可以去 下面我的博客资源下载 https://download.csdn.net/download/tomxjc/88685970 文章…

C++语言之类与对象1

什么是类 类是一种抽象的数据类型&#xff0c;作为对象的蓝图或模板&#xff0c;它将具有相同属性和行为的对象进行统一抽象封装。其中属性描述对象的特征&#xff0c;如 “汽车” 类中的颜色、品牌等&#xff1b;方法则定义对象可执行的操作&#xff0c;像 “汽车” 类的启动、…

Elasticsearch 和 Kibana 8.16:Kibana 获得上下文和 BBQ 速度并节省开支!

作者&#xff1a;来自 Elastic Platform Product Team Elastic Search AI 平台&#xff08;Elasticsearch、Kibana 和机器学习&#xff09;的 8.16 版本包含大量新功能&#xff0c;可提高性能、优化工作流程和简化数据管理。 使用更好的二进制量化 (Better Binary Quantizatio…

【Golang】——Gin 框架简介与安装

文章目录 1. Gin 框架概述1.1 什么是 Gin 框架&#xff1f;1.2 为什么选择 Gin&#xff1f;1.3 使用场景 2. 安装 Go 与 Gin 框架2.1 安装 Go 语言环境2.2 初始化 Go 项目2.3 安装 Gin 框架 3. 编写第一个 Gin 应用3.1 Gin 最小化示例代码代码解读3.2 运行程序3.3 测试服务 4. …

RGB与YCbCr转换算法

目录 RGB与YCbCr转换算法RGB与YCbCr色域介绍RGB模型YCbCr色域简介YCbCr的应用YUV 和 YCbCr 的区别 色彩转换公式 RGB 转 YCbCr 实现RGB 转 YCbCr 的 Matlab 实现RGB 转 YCbCr 的 FPGA 实现 YCbCr 转 RGB 实现YCbCr 转 RGB 的 Matlab 实现YCbCr 转 RGB 的 FPGA 实现 RGB与YCbCr转…

WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇&#xff08;本文&#xff09; WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…

MAC上的Office三件套报53错误解决方案(随笔记)

目录 现象原因解决方式1. 可视化2. 命令行 参考链接 现象 最近Mac Mini M4非常热门&#xff0c;我也种草买了一台丐中丐版本来体验一下。 在安装Office三件套后&#xff0c;遇到了一个53的错误&#xff1a; Run-time error 53:File not found: Library/Application Support/A…

人工智能与SEO优化中的关键词策略解析

内容概要 在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;与搜索引擎优化&#xff08;SEO&#xff09;的结合正变得愈发重要。关键词策略是SEO优化的一项基础工作&#xff0c;它直接影响到网站的可见性和流量。通过运用智能算法&#xff0c;企业能…

【数据库】如何保证数据库迁移过程中数据的一致性?

在数据库迁移过程中&#xff0c;保证数据的一致性是非常重要的&#xff0c;尤其是在涉及到多个表、多个数据库或分布式系统的情况下。以下是一些确保数据一致性的最佳实践和方法&#xff1a; 1. 备份数据 在开始迁移之前&#xff0c;进行全面的数据备份是确保数据一致性的第…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点&#xff0c;其中一个有 pod&#xff0c;另一个则没有&#xff0c;那么新的 pod 会被调度到哪个节点上&#xff1f; 应用程序通过容器的形式运行&#xff0c;如果 OOM&#xff08;Out-of-Memory&#xff09;了&#xff0c;是容器重…

Spring:IoC/DI加载properties文件

Spring框架可以通过Spring的配置文件完成两个数据源druid和C3P0的配置&#xff08;Spring&#xff1a;IOC/DI配置管理第三方bean&#xff09;&#xff0c;但是其中包含了一些问题&#xff0c;我们来分析下: 这两个数据源中都使用到了一些固定的常量如数据库连接四要素&#xf…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…