3-Gin 渲染 --[Gin 框架入门精讲与实战案例]
在 Gin 框架中,渲染指的是将数据传递给模板,并生成 HTML 或其他格式的响应内容。Gin 支持多种类型的渲染,包括 String HTML、JSON、XML 等。
String 渲染
在 Gin 框架中,String
渲染方法允许你直接返回一个字符串作为 HTTP 响应。这非常适合于简单的 API 或者需要快速响应的场景。下面我将给出四个使用 String
方法渲染不同内容的示例。
示例 1:基本的字符串响应
这个例子展示了如何返回一个简单的字符串作为 HTTP 响应。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/hello", func(c *gin.Context) {c.String(200, "Hello, World!")})// 启动HTTP服务,默认在0.0.0.0:8080启动服务router.Run()
}
示例 2:带状态码的字符串响应
在这个例子中,我们不仅返回了字符串,还指定了自定义的状态码。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/not-found", func(c *gin.Context) {c.String(404, "资源未找到")})// 启动HTTP服务router.Run(":8080")
}
示例 3:包含变量的字符串响应
这里展示了如何在字符串响应中插入变量值。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/greet/:name", func(c *gin.Context) {name := c.Param("name")c.String(200, "你好, %s!", name)})// 启动HTTP服务router.Run(":8080")
}
示例 4:基于条件的字符串响应
最后一个例子演示了根据请求参数或其它逻辑条件返回不同的字符串响应。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/status", func(c *gin.Context) {statusParam := c.Query("status")switch statusParam {case "ok":c.String(200, "系统状态正常")case "error":c.String(500, "系统出现错误")default:c.String(200, "未知状态")}})// 启动HTTP服务router.Run(":8080")
}
这些示例展示了如何使用 Gin 的 String
方法来创建简洁、高效的 HTTP 响应。你可以根据自己的需求调整代码,以适应更复杂的应用场景。例如,在实际应用中,你可能希望从数据库或其他数据源获取动态信息,并将其嵌入到字符串响应中。
JSON渲染
在 Gin 框架中,JSON 渲染是非常常见的操作,尤其是在构建 RESTful API 时。Gin 提供了方便的方法来直接返回 JSON 格式的响应。下面我将给出四个使用 JSON
方法渲染不同内容的示例。
示例 1:基本的 JSON 响应
这个例子展示了如何返回一个简单的 JSON 对象作为 HTTP 响应。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/hello", func(c *gin.Context) {c.JSON(200, gin.H{"message": "Hello, World!",})})// 启动HTTP服务,默认在0.0.0.0:8080启动服务router.Run()
}
示例 2:带状态码的 JSON 响应
在这个例子中,我们不仅返回了 JSON 数据,还指定了自定义的状态码,并且包含了一个错误信息。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/not-found", func(c *gin.Context) {c.JSON(404, gin.H{"error": "资源未找到",})})// 启动HTTP服务router.Run(":8080")
}
示例 3:返回结构体的 JSON 响应
这里展示了如何将 Go 结构体序列化为 JSON 并返回给客户端。
package mainimport ("fmt""github.com/gin-gonic/gin"
)// User 用户信息结构体
type User struct {ID int `json:"id"`Name string `json:"name"`Age int `json:"age"`
}func main() {router := gin.Default()// 定义路由和处理函数router.GET("/user/:id", func(c *gin.Context) {id := c.Param("id")fmt.Println("用户ID:", id)user := User{ID: 1, Name: "张三", Age: 30} // 这里应该是从数据库获取用户信息c.JSON(200, user)})// 启动HTTP服务router.Run(":8080")
}
示例 4:基于条件的 JSON 响应
最后一个例子演示了根据请求参数或其它逻辑条件返回不同的 JSON 响应。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/status", func(c *gin.Context) {statusParam := c.Query("status")var response map[string]interface{}switch statusParam {case "ok":response = gin.H{"status": "系统状态正常"}case "error":response = gin.H{"status": "系统出现错误", "code": 500}default:response = gin.H{"status": "未知状态"}}c.JSON(200, response)})// 启动HTTP服务router.Run(":8080")
}
这些示例展示了如何使用 Gin 的 JSON
方法来创建高效的 JSON 响应。你可以根据自己的需求调整代码,以适应更复杂的应用场景。例如,在实际应用中,你可能希望从数据库或其他数据源获取动态信息,并将其嵌入到 JSON 响应中。此外,还可以考虑添加错误处理、日志记录等增强功能。
XML渲染
在 Gin 框架中,渲染 XML 响应是一个常见的需求,尤其是在与某些旧系统或特定 API 集成时。Gin 提供了方便的方法来直接返回 XML 格式的响应。下面我将给出四个使用 XML
方法渲染不同内容的示例。
示例 1:基本的 XML 响应
这个例子展示了如何返回一个简单的 XML 对象作为 HTTP 响应。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/hello", func(c *gin.Context) {response := gin.H{"message": "Hello, World!",}c.XML(200, response)})// 启动HTTP服务,默认在0.0.0.0:8080启动服务router.Run()
}
示例 2:带状态码的 XML 响应
在这个例子中,我们不仅返回了 XML 数据,还指定了自定义的状态码,并且包含了错误信息。
package mainimport ("github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/not-found", func(c *gin.Context) {errorResponse := gin.H{"error": "资源未找到",}c.XML(404, errorResponse)})// 启动HTTP服务router.Run(":8080")
}
示例 3:返回结构体的 XML 响应
这里展示了如何将 Go 结构体序列化为 XML 并返回给客户端。需要注意的是,为了正确地序列化为 XML,结构体字段需要带有 xml
标签。
package mainimport ("fmt""github.com/gin-gonic/gin"
)// User 用户信息结构体
type User struct {XMLName struct{} `xml:"user"` // 这个字段用于指定根元素名称ID int `xml:"id"`Name string `xml:"name"`Age int `xml:"age"`
}func main() {router := gin.Default()// 定义路由和处理函数router.GET("/user/:id", func(c *gin.Context) {id := c.Param("id")fmt.Println("用户ID:", id)user := User{ID: 1, Name: "张三", Age: 30} // 这里应该是从数据库获取用户信息c.XML(200, user)})// 启动HTTP服务router.Run(":8080")
}
示例 4:基于条件的 XML 响应
最后一个例子演示了根据请求参数或其它逻辑条件返回不同的 XML 响应。
package mainimport ("fmt""github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 定义路由和处理函数router.GET("/status", func(c *gin.Context) {statusParam := c.Query("status")var response map[string]interface{}switch statusParam {case "ok":response = gin.H{"status": "系统状态正常"}case "error":response = gin.H{"status": "系统出现错误", "code": 500}default:response = gin.H{"status": "未知状态"}}fmt.Println(response)c.XML(200, response)})// 启动HTTP服务router.Run(":8080")
}
注意事项
- XML 标签:当您想要控制 XML 输出的具体格式时,可以使用结构体标签(如
xml:"tagname"
)来指定每个字段对应的 XML 元素名称。 - 命名空间:如果您的 XML 需要支持命名空间,可以通过添加额外的标签来实现,例如
xml:"xmlns:ns http://example.com/ns"
。 - CDATA 节点:对于包含特殊字符的数据,您可以考虑使用 CDATA 节点来避免转义问题。这通常需要手动构建 XML 字符串或者使用第三方库。
这些示例展示了如何使用 Gin 的 XML
方法来创建高效的 XML 响应。你可以根据自己的需求调整代码,以适应更复杂的应用场景。例如,在实际应用中,你可能希望从数据库或其他数据源获取动态信息,并将其嵌入到 XML 响应中。此外,还可以考虑添加错误处理、日志记录等增强功能。
HTML渲染
当然,下面我将给出一个使用 Gin 框架渲染 HTML 模板的示例。这个例子将展示如何加载模板文件、传递数据给模板以及渲染模板为 HTTP 响应。
示例:基本的 HTML 渲染
1. 创建 HTML 模板文件
首先,创建一个简单的 HTML 文件作为模板。假设我们将它保存在 templates
文件夹下,并命名为 index.tmpl
。
<!-- templates/index.tmpl -->
<!DOCTYPE html>
<html>
<head><title>{{.Title}}</title>
</head>
<body><h1>{{.Title}}</h1><p>{{.Message}}</p>
</body>
</html>
2. 编写 Go 程序
接下来,编写 Go 程序来设置路由并渲染上述模板。
package mainimport ("github.com/gin-gonic/gin"
)func main() {// 创建默认的 Gin 路由引擎router := gin.Default()// 加载所有 templates 文件夹中的 .tmpl 文件router.LoadHTMLGlob("templates/*")// 定义路由和处理函数router.GET("/", func(c *gin.Context) {// 渲染模板并传递数据c.HTML(200, "index.tmpl", gin.H{"Title": "我的网站","Message": "欢迎来到我的网站!",})})// 启动HTTP服务,默认在0.0.0.0:8080启动服务router.Run()
}
运行程序
确保你的项目结构如下:
your_project/
├── main.go
└── templates/└── index.tmpl
然后你可以通过命令行运行程序:
go run main.go
访问 http://localhost:8080/
,你应该会看到你定义的 HTML 页面,标题和内容根据传递的数据动态生成。
解释
LoadHTMLGlob
:这个方法用于加载匹配指定模式的所有模板文件。在这个例子中,它会加载templates
文件夹下的所有.tmpl
文件。c.HTML
:这是 Gin 提供的一个方法,用于渲染 HTML 模板。它接受三个参数:HTTP 状态码、模板名称(不包括路径)以及要传递给模板的数据。这里我们传递了一个gin.H
类型的匿名映射作为数据,其中包含了Title
和Message
键值对。
这个简单的例子展示了如何使用 Gin 框架结合 Go 的标准库 html/template
来进行 HTML 模板渲染。你可以根据需要扩展这个基础,例如添加更多的路由、处理表单提交等。
相关文章:

3-Gin 渲染 --[Gin 框架入门精讲与实战案例]
在 Gin 框架中,渲染指的是将数据传递给模板,并生成 HTML 或其他格式的响应内容。Gin 支持多种类型的渲染,包括 String HTML、JSON、XML 等。 String 渲染 在 Gin 框架中,String 渲染方法允许你直接返回一个字符串作为 HTTP 响应…...

python小课堂(一)
基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…...

GESP202309 二级【小杨的 X 字矩阵】题解(AC)
》》》点我查看「视频」详解》》》 [GESP202309 二级] 小杨的 X 字矩阵 题目描述 小杨想要构造一个 的 X 字矩阵( 为奇数),这个矩阵的两条对角线都是半角加号 ,其余都是半角减号 - 。例如,一个 5 5 5 \times 5 5…...
@PostConstruct注解解释!!!!
PostConstruct 注解修饰的方法是在 Bean 完成初始化后自动调用的。它是 Java EE 和 Spring 中的一种机制,用于在 Bean 被创建并依赖注入完成后,执行一些初始化的操作。 具体触发时机: 依赖注入完成后:首先,Spring 容器…...

laya游戏引擎中打包之后图片模糊
如下图正常运行没问题,打包之后却模糊 纹理类型中的默认类型都是精灵纹理,改为默认值即可。注意:要点击“应用”才可有效。精灵纹理类型会对图片进行渲染处理,而默认值 平面类型不会处理图片。...

【数据结构练习题】链表与LinkedList
顺序表与链表LinkedList 选择题链表面试题1. 删除链表中等于给定值 val 的所有节点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。4. 输入一个链表,输出该链…...

[项目代码] YOLOv8 遥感航拍飞机和船舶识别 [目标检测]
项目代码下载链接 <项目代码>YOLO 遥感航拍飞机和船舶识别<目标检测>https://download.csdn.net/download/qq_53332949/90163939YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为…...

移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备
移动魔百盒中的 OpenWrt作为旁路由 安装Tailscale并配置子网路由实现在外面通过家里的局域网ip访问内网设备 一、前提条件 确保路由器硬件支持: OpenWrt 路由器需要足够的存储空间和 CPU 性能来运行 Tailscale。确保设备架构支持 Tailscale 二进制文件,例…...

JVM对象分配内存如何保证线程安全?
大家好,我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,对象的内存分配…...

ArcGIS计算土地转移矩阵
在计算土地转移矩阵时,最常使用的方法就是在ArcGIS中将土地利用栅格数据转为矢量,然后采用叠加分析计算,但这种方法计算效率低。还有一种方法是采用ArcGIS中的栅格计算器,将一个年份的地类编号乘以个100或是1000再加上另一个年份的…...
数据库 MYSQL的概念
数据库的概念 数据库是按照数据结 构来组织、存储和管理数据的系统,它允许用户高效地存储、检索、更新和管理数据 database:用来组织,存储,管理数据的仓库 数据库的管理系统:DBMS,实现对数据的有效储值&am…...

Node.js后端程序打包问题汇总(webpack、rsbuild、fastify、knex、objection、sqlite3、svg-captcha)
背景说明 场景 使用 node.js 进行后端开发,部署时通常需要打包为单文件,然后放到服务器运行。 这里记录我在打包过程中,碰到的各类问题及解决方案,希望能够帮助到更多道友😄 提示 此文持续更新,可以收藏⭐…...
部署 Apache Samza 和 Apache Kafka
部署 Apache Samza 和 Apache Kafka 的流处理系统可以分为以下几个步骤,涵盖环境准备、部署细节和生产环境的优化。 1. 环境准备 硬件要求 Kafka Broker:至少 3 台服务器,建议每台服务器配备 4 核 CPU、16GB 内存和高速磁盘。Samza 部署节点:根据任务规模,至少准备 2 台…...

xiaomiR4c openwrt
文章目录 openwrt 安装openwrt 配置开启WiFi 救砖minieap编译参数帮助 openwrt 安装 Router:xiaomi R4C官方固件:openwrt 23.05.5 (下图标红处)官方教程 下载 OpenWRTInvasionpython remote_command_execution_vulnerability.py …...

leetcode-128.最长连续序列-day14
为什么我感觉上述代码时间复杂度接近O(2n), 虽然有while循环,但是前面有个if判断,能进入while循环的也不多,while循环就相当于两个for循环,但不是嵌套类型的: 变量作用域问题:...

梳理你的思路(从OOP到架构设计)_简介设计模式
目录 1、 模式(Pattern) 是较大的结构编辑 2、 结构形式愈大 通用性愈小编辑 3、 从EIT造形 组合出设计模式 1、 模式(Pattern) 是较大的结构 组合与创新 達芬奇說:簡單是複雜的終極形式 (Simplicity is the ultimate form of sophistication) —Leonardo d…...
JAVA前端开发中type=“danger“和 type=“text“的区别
在前端开发中,type 属性通常用于指定按钮或其他元素的样式或行为。不同的框架和库可能对 type 属性有不同的定义和用法。常见的框架包括 Bootstrap、Ant Design(antd)、Element Plus 等。下面我将分别介绍在这些框架中 type"danger"…...
python 中执行from elasticsearch import Elasticsearch,AsyncElasticsearch 报错
在 Python 中执行 from elasticsearch import Elasticsearch, AsyncElasticsearch 时,如果提示 AsyncElasticsearch 不存在,可能是因为以下几个原因: 1. 安装的 elasticsearch 库版本不匹配 AsyncElasticsearch 是在 elasticsearch 库的较新版本中引入的。如果你安装的版本…...

带有 Elasticsearch 和 Langchain 的 Agentic RAG
作者:来自 Elastic Han Xiang Choong 讨论并实现 Elastic RAG 的代理流程,其中 LLM 选择调用 Elastic KB。 更多阅读:Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索。 简介 代理是将 LLM 应用于实际用例的…...

Jenkins持续集成部署——jenkins安装
前言 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)。它为软件开发团队提供了一个易于使用的平台来自动化构建、测试和部署应用程序的过程。 Jenkins 主要功能 1. 持续集成 (CI) 自动构建…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...