【Golang】Gin框架中如何定义路由

✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

文章目录
- Gin框架路由
- 一、Gin框架的安装和基本使用
- 二、Gin框架的路由类型
- 三、路由参数
- 四、路由分组
- 五、静态文件服务
- 六、路由重定向
- 七、404错误处理
- 八、综合案例
- 注意事项
- 九、结论
Gin框架路由
Gin是一个用Go语言编写的Web框架,具有高性能和易于使用的特点。在Gin框架中,路由是核心功能之一,通过路由可以将不同的URL路径绑定到相应的处理函数上。本文将结合实际案例,详细介绍Gin框架的路由用法。
一、Gin框架的安装和基本使用
首先,需要在你的Go环境中安装Gin框架。你可以通过以下命令进行安装:
go get -u github.com/gin-gonic/gin
安装完成后,可以编写一个简单的Gin程序来测试安装是否成功。新建一个main.go文件,并编写以下代码:
package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default() // 创建一个默认的Gin引擎实例,包含Logger和Recovery中间件r.GET("/", func(c *gin.Context) {c.String(200, "Hello, Gin!") // 返回HTTP状态码200和字符串"Hello, Gin!"})r.Run() // 运行Gin应用,默认监听在0.0.0.0:8080
}
运行上述代码后,在浏览器中访问http://localhost:8080,你将看到页面显示“Hello, Gin!”。
二、Gin框架的路由类型
Gin框架支持多种HTTP请求类型的路由,包括GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS等。你可以根据实际需要选择合适的路由类型。
- GET请求
GET请求通常用于获取资源。以下是一个简单的GET请求路由示例:
r.GET("/get", func(c *gin.Context) {c.JSON(200, gin.H{"message": "get方法"})
})
- POST请求
POST请求通常用于创建资源。以下是一个POST请求路由示例:
r.POST("/post", func(c *gin.Context) {c.JSON(200, gin.H{"message": "post方法"})
})
- PUT请求
PUT请求通常用于更新资源。以下是一个PUT请求路由示例:
r.PUT("/put", func(c *gin.Context) {c.JSON(200, gin.H{"message": "put方法"})
})
- DELETE请求
DELETE请求通常用于删除资源。以下是一个DELETE请求路由示例:
r.DELETE("/delete", func(c *gin.Context) {c.JSON(200, gin.H{"message": "delete方法"})
})
- 其他请求类型
Gin还支持PATCH、HEAD、OPTIONS等请求类型,用法与上述类似。例如,一个PATCH请求路由示例如下:
r.PATCH("/patch", func(c *gin.Context) {c.JSON(200, gin.H{"message": "patch方法"})
})
三、路由参数
Gin框架支持在路由中定义参数,参数可以通过c.Param("key")方法获取。参数可以是URL路径中的一部分,也可以是查询字符串中的一部分。
- URL路径参数
URL路径参数通常用于动态路由。例如,假设我们有一个用户资源,需要根据用户名获取用户信息,可以使用以下路由:
r.GET("/user/:name", func(c *gin.Context) {name := c.Param("name")c.JSON(200, gin.H{"message": "用户名为: " + name})
})
访问http://localhost:8080/user/张三时,将会返回{"message": "用户名为: 张三"}。
- 查询字符串参数
查询字符串参数通常用于传递额外的信息。例如,假设我们有一个登录接口,需要接收用户名和密码作为查询字符串参数,可以使用以下路由:
r.GET("/login", func(c *gin.Context) {name := c.Query("name")password := c.Query("password")c.JSON(200, gin.H{"name": name, "password": password})
})
访问http://localhost:8080/login?name=张三&password=123456时,将会返回{"name": "张三", "password": "123456"}。
四、路由分组
当你有多个路由具有相同的前缀时,可以使用路由分组来简化路由的定义。例如,假设我们有一个API接口,所有的API路径都以/api为前缀,可以使用以下代码进行路由分组:
package mainimport ("github.com/gin-gonic/gin"
)func main() {engine := gin.Default()//定义路由组 所有路由都以api为前缀api := engine.Group("/api")//使用路由组// 我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对`{}`包裹同组的路由,这只是为了看着清晰,你用不用`{}`包裹功能上没什么区别。{//get请求走这个api.GET("/users", func(c *gin.Context) {c.JSON(200, gin.H{"message": "获取用户列表"})})//post请求走这个api.POST("/users", func(c *gin.Context) {c.JSON(200, gin.H{"message": "创建用户"})})}engine.Run()
}
这样,访问/api/users和/api/users分别会触发相应的处理函数。
get请求:

post请求:

五、静态文件服务
Gin框架还可以提供静态文件服务。例如,假设你有一个static目录,希望将其中的文件提供给用户访问,可以使用以下代码:
r.Static("/static", "./static")
这样,访问http://localhost:8080/static/test.txt时,将会返回static目录下的test.txt文件内容。
六、路由重定向
Gin框架支持路由重定向。例如,假设你希望将/old路径重定向到/new路径,可以使用以下代码:
r.GET("/old", func(c *gin.Context) {c.Redirect(301, "/new") // 301表示永久重定向
})r.GET("/new", func(c *gin.Context) {c.JSON(200, gin.H{"message": "这是新路径"})
})
访问http://localhost:8080/old时,将会被重定向到/new路径,并返回{"message": "这是新路径"}。
七、404错误处理
Gin框架允许你自定义404错误处理逻辑。例如,你可以使用以下代码来处理未匹配的路由:
r.NoRoute(func(c *gin.Context) {c.JSON(404, gin.H{"message": "Not Found"})
})
这样,当访问一个未定义的路由时,将会返回{"message": "Not Found"}和HTTP状态码404。
八、综合案例
以下是一个综合案例,展示了如何使用Gin框架的路由功能来构建一个简单的RESTful API。
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()// 用户资源路由user := r.Group("/users"){user.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "获取用户列表"})})user.GET("/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(200, gin.H{"message": "获取用户信息", "id": id})})user.POST("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "创建用户"})})user.PUT("/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(200, gin.H{"message": "更新用户信息", "id": id})})user.DELETE("/:id", func(c *gin.Context) {id := c.Param("id")c.JSON(200, gin.H{"message": "删除用户信息", "id": id})})}// 登录接口路由r.POST("/login", func(c *gin.Context) {name := c.PostForm("name")password := c.PostForm("password")c.JSON(200, gin.H{"name": name, "password": password})})// 静态文件服务r.Static("/static", "./static")// 路由重定向r.GET("/old", func(c *gin.Context) {c.Redirect(301, "/new")})r.GET("/new", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "This is the new path"})})// 404错误处理r.NoRoute(func(c *gin.Context) {c.JSON(http.StatusNotFound, gin.H{"message": "Page not found"})})// 启动服务器r.Run(":8080") // 默认监听在 0.0.0.0:8080
}
在这个综合案例中,我们创建了一个简单的RESTful API,包括用户资源的增删改查操作,一个登录接口,静态文件服务,路由重定向以及404错误处理。
-
用户资源路由:
GET /users:获取用户列表。GET /users/:id:根据ID获取用户信息。POST /users:创建用户。PUT /users/:id:更新用户信息。DELETE /users/:id:删除用户信息。
-
登录接口路由:
POST /login:接收用户名和密码,返回登录信息。
-
静态文件服务:
- 访问
/static目录下的文件,例如http://localhost:8080/static/test.txt。
- 访问
-
路由重定向:
- 访问
/old会被重定向到/new。
- 访问
-
404错误处理:
- 访问未定义的路由会返回
{"message": "Page not found"}和HTTP状态码404。
- 访问未定义的路由会返回
注意事项
- 在生产环境中,建议使用
gin.ReleaseMode()来启动Gin引擎,以禁用调试信息并提高性能。 - 在处理敏感信息(如密码)时,应使用HTTPS来保护数据传输的安全性。
- 在处理用户输入时,应进行适当的验证和过滤,以防止SQL注入、XSS等安全问题。
- 在处理文件上传时,应限制文件大小、类型等,以防止恶意文件上传。
九、结论
Gin框架是一个功能强大且易于使用的Go语言Web框架。通过本文的介绍,你可以了解到Gin框架的路由用法,包括基本路由类型、路由参数、路由分组、静态文件服务、路由重定向以及404错误处理等。希望这些内容能够帮助大家更好地理解和使用Gin框架来构建Web应用。
相关文章:
【Golang】Gin框架中如何定义路由
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
CPU内存飙升
CPU 飙升介绍 CPU 飙升是指中央处理器(CPU)的使用率在短时间内急剧上升,达到一个较高的水平。正常情况下,CPU 会根据系统和应用程序的需求合理分配资源,使用率会在一定范围内波动。但当 CPU 飙升时,可能会导…...
【Java】LinkedList实现类的使用
LinkedList实现类的使用 package com.star.test04;import java.util.Iterator;import java.util.LinkedList;/** * author : Starshine */public class Test { //这是main方法,程序的入口 public static void main(String[] args) { /* LinkedL…...
创建人物状态栏
接下来,我们来尝试制作一下我们的UI,我们会学习unity基本的UI系统 ************************************************************************************************************** 我们要先安装一个好用的插件到我们的unity当中,帮助…...
django5入门【01】环境配置
注意: ⭐前提:安装了annaconda(python版本管理工具),如果没有安装,强烈建议安装一下!!!操作: 前言: 这里新创建一个名为“python_3.11_start_dja…...
1000集《楼兰》系列短剧开机仪式在疆举行,开启全球传播新篇章
2024年10月18日,光明媚,秋风送爽。 在这个收获的季节里,倍受期待的楼兰系列短剧《楼兰之天女归来》和《楼兰之时空秘宝》在新疆吐鲁番东方红卓览文化博物馆举行了隆重的开机仪式,正式拉开了摄制的序幕。 1000集《楼兰》系列短剧…...
【景观生态学实验】实验五 景观生态脆弱性评价
实验目的 1.学习层次分析模型思路,对丹江口库区2000年景观生态脆弱性评价建模:通过实验课的学习,深入理解层次分析(Analytic Hierarchy Process,AHP)理论与模型,了解其在决策问题中的应用&…...
ChatGPT 现已登陆 Windows 平台
今天,OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示,该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户,是一个早期版本,将在今年晚些时候推出"完整体验"。…...
和鲸社区数据科学实训季,西安交通大学圆满收官,西安,后会有期!
和鲸社区数据科学实训季活动已走进数十家高校,在西安的收官之站,落定西安交通大学管理学院,为本次西安之旅画上了圆满的句号。 和鲸社区 2024秋 数据科学实训季以“帮助同学积累真实场景项目经验”为出发点,提供 60 个数据科学实践…...
工作使用篇:如何在centos系统中安装anaconda
在CentOS 7上安装Anaconda的步骤如下: 1. 下载Anaconda 首先,你需要下载Anaconda的安装脚本。可以使用wget命令从Anaconda的官网获取最新版本的安装脚本。打开终端并运行以下命令: wget https://repo.anaconda.com/archive/Anaconda3-2024…...
qt creator 转 visual stdio 项目调试
因果 大家在使用qt creator调试程序时,会出现未知错误,比如下图,直接release运行就没有问题。由于调试复杂程序,使用qt creator都感觉不如vs,会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…...
django5入门【02】创建新的django程序
注意: ⭐前提:已经安装了python以及django所依赖的包1、通过django-admin管理工具在命令行创建Django应用程序,创建命令如下: django-admin startproject ProjectName❓ 疑问:除了使用命令行创建django程序外&#x…...
乐趣无限,十个让你沉浸的“摸鱼”网站
在繁忙的生活中,我们总需要一些摸鱼时刻,来为紧绷的神经松绑。无论是工作间隙的小憩,还是下班后的放松,适当的摸鱼不仅能提升效率,还能让生活充满乐趣。今天,我为大家推荐几个绝对能让你乐在其中的网站&…...
ubuntu22.04 桌面系统怎么搭建一个esp-idf的项目,搭建开发环境
详细介绍如何在 Ubuntu 22.04 桌面系统上搭建 ESP-IDF 的开发环境,并创建一个 ESP-IDF 项目。以下内容将涵盖从环境准备到项目创建和编译的所有步骤。 目录 环境准备 1.1 更新系统1.2 安装必要的工具和依赖项 安装 ESP-IDF 2.1 克隆 ESP-IDF 仓库2.2 运行安装脚本 …...
iOS Swift逆向——deMangle过程中的偏移计算
碰到好多函数最开始都会调用这个函数,xref了一下,发现有上万个xref。 __int64 __fastcall sub_1000B6ED0(__int64 *a1) {__int64 result; // x0result *a1;if ( result < 0 ){result swift_getTypeByMangledNameInContext((char *)a1 (int)result…...
国产大模型基础能力大比拼 - 计数:通义千文 vs 文心一言 vs 智谱 vs 讯飞-正经应用场景的 LLM 逻辑测试
在大语言模型(LLM)不断涌现的时代,如何评估这些国产大模型的逻辑推理能力,尤其是在处理基础计数问题上的表现,成为了一个备受关注的话题。随着越来越多的国产大模型进入市场,比较它们在不同任务中的表现尤为…...
YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 卷积和自注意力是两种强大的表征学习技术…...
0基础学java之Day11
二维数组 静态二位数组 理解:二维数组中包含了多个一维数组 声明: 数据类型 变量名;--推荐 数据类型 变量名; //静态初始化1//String[][] names new String[][]{{"小红","小绿","小蓝"},{"小黄","小紫…...
python主流框架Django:ORM框架关联查询与管理器
目录 注意 使用前要调用之前的模型类 F对象 Q对象 聚合函数 排序 关联查询(连表查询) 修改 删除 查询集 QuerySet 注意 使用前要调用之前的模型类 F对象 之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用 "F对象&quo…...
如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧
在电子商务领域,内容为王。新鲜、相关且有吸引力的内容能显著提升客户参与度和转化率。本文将探讨如何有效更新和维护您的在线商店内容,确保客户始终获得最佳体验。 定期更新产品信息 产品描述 产品描述是吸引客户和促成销售的关键。定期检查并更新产…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
