Gin笔记二之gin.Engine和路由设置

news/2025/10/29 23:54:55/文章来源:https://www.cnblogs.com/hunterxiong/p/19175625

本文首发于公众号:Hunter后端

原文链接:Gin笔记二之gin.Engine和路由设置

这一篇笔记主要介绍 gin.Engine,设置路由等操作,以下是本篇笔记目录:

  1. gin.Default() 和 gin.New()
  2. HTTP 方法
  3. 路由分组与中间件

1、gin.Default() 和 gin.New()

前面第一篇笔记介绍,创建一个 gin 的路由引擎使用的函数是 gin.Default(),返回的类型是 *gin.Engine,我们可以使用其创建路由和路由组。

除了这个函数外,还有一个 gin.New(),其返回的也是 *gin.Engine,但是不一样的是 gin.Default() 会对 gin.Engine 添加默认的 Logger()Recovery() 中间件。

这两个函数大致内容如下:

func New(opts ...OptionFunc) *Engine {...
}func Default(opts ...OptionFunc) *Engine {...engine := New()engine.Use(Logger(), Recovery())...
}

我们使用第一篇笔记中使用 debug 模式运行系统后输出的信息可以再看一下:

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:   export GIN_MODE=release- using code:  gin.SetMode(gin.ReleaseMode)[GIN-debug] GET    /test                     --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9898

我们使用的是 gin.Default() 运行的系统,所以在第一行告诉我们创建了一个带有 Logger and Recovery 中间件的 Engine

同时第三行输出路由信息的地方,标明了这个路由指向的处理函数,后面的括号里是 3 handlers,这个意思是除了我们处理路由的 handler,还有两个默认的中间件 handler,也就是这里的 Logger()Recovery() 中间件。

下面介绍一下 Logger()Recovery() 这两个 handler 的作用。

1. Logger()

默认的 Logger() 会输出接口调用的信息,比如第一篇中我们定义了一个 /test 接口,当我们调用这个接口的时候,控制台会输出下面这条信息:

[GIN] 2025/08/19 - 23:15:26 | 200 |      36.666µs |       127.0.0.1 | GET      "/test"

可以看到日志中会包含请求时间、返回的 HTTP 状态码、请求耗时、调用方 ip、请求方式和接口名称等。

这条日志信息的输出就是 Logger() 这个中间件起的作用。

在其内部,会调用一个 LoggerWithConfig() 函数,获取到请求的 ip、记录调用时间、调用方式等信息,然后进行输出,下面是部分源码信息:

param.TimeStamp = time.Now()
param.Latency = param.TimeStamp.Sub(start)param.ClientIP = c.ClientIP()
param.Method = c.Request.Method
param.StatusCode = c.Writer.Status()
param.ErrorMessage = c.Errors.ByType(ErrorTypePrivate).String()

2. Recovery()

Recovery() 中间件则可以为我们捕获程序中未处理的 panic,记录错误信息并返回 500 状态码信息,比如我们在第一篇笔记中使用的 TestHandler 函数,我们在其中加一个除数为 0 的错误:

func TestHandler(c *gin.Context) {response := TestResponse{Code:    0,Message: "success",}a := 0fmt.Println(1 / a)c.JSON(http.StatusOK, response)
}

在接口调用的时候,如果我们使用的是 gin.Default(),那么客户端不会报错,而是会收到一个 HTTP 状态码为 500 的报错信息,而如果使用的是 gin.New(),客户端则会直接发生错误。

总的来说,Logger()Recovery() 这两个的中间件是 gin 框架为我们默认添加的对于开发者来说较为友好的两个操作,在后面介绍中间件的时候,我们也可以手动实现这两个功能。

2、HTTP 方法

gin.Engine 支持配置 HTTP 多个方法,比如 GET、POST、PUT、DELETE 等。

以第一篇笔记中的代码为例,其设置方法如下:

r.GET("/test", TestHandler)
r.POST("/test", TestHandler)
r.PUT("/test", TestHandler)
r.DELETE("/test", TestHandler)

3、路由分组与中间件

除了设置单个路由,我们还可以对路由进行分组设置,比如需要控制版本,或者模块设置需要统一的前缀,又或者是需要统一设置中间件功能的时候。

其整体代码示例如下:

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)type TestResponse struct {Code    int    `json:"code"`Message string `json:"message"`
}func TestHandler(c *gin.Context) {response := TestResponse{Code:    0,Message: "success",}c.JSON(http.StatusOK, response)
}func main() {r := gin.Default()v1 := r.Group("/v1"){v1.GET("/test", TestHandler)}err := r.Run(":9898")if err != nil {fmt.Println("gin run in 9898 error:", err)}
}

这里,我们设置了一个路由名称以 v1 为前缀的路由组,其下每个路由的访问都需要带有 /v1,这样就实现了统一设置路由前缀的功能。

而如果我们需要向其中添加中间件的时候,也可以不用挨个路由进行设置,而是在 v1 路由组的设置中就可以实现,比如:

v1 := r.Group("/v1", Middleware1, Middleware2)

这样,其下每个路由的 handler 函数在调用前就都会先调用 Middleware1Middleware2 这两个中间件。

以上就是本篇笔记关于 gin.Engine 的全部内容,其实中间件的相关操作也应该属于 gin.Engine 的内容,但是那部分需要介绍的知识点和想要用于介绍的代码示例略多,所以就单独开一篇笔记在后面再介绍。

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

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

相关文章

阅读笔记一:以“刻意练习”筑牢成长根基 - 20243867孙堃2405

《程序员的修炼之路:从小工到专家》并非一本罗列技术知识点的工具书,而是一部指引开发者突破职业瓶颈的思维指南。书中最触动我的,是对“成长本质”的深刻剖析——从“小工”到“专家”,从来不是资历的自然累积,而…

flv 转化成 mp4 文件

ffmpeg -i "原视频.flv" -c copy "新视频.mp4"因为你用了 -c copy,意思是:不重新压缩/重编码(既不压音频也不压视频) 只是直接把原始音视频流复制进一个新的容器格式(从 .flv 换到 .mp4) 所…

牛客刷题-Day18

模拟、枚举与贪心 https://ac.nowcoder.com/acm/contest/20960?from=acdiscuss牛客刷题-Day18 今日刷题:\(1001-1010\) 1001 模拟 例1-字符串展开解题思路 模拟,注意细节就可以。 C++ 代码 #include <bits/stdc…

网络连接的核心——TCP/IP体系结构

网络连接的核心——TCP/IP体系结构一、网络连接的核心 前言:局域网作为互联网的核心,但是不同的局域网之间采用的是不同的技术(传输介质、介质控制方法、程真方法等)通过利用IP协议将这些网络从用户层面看起来是一…

C++练习-函数

double dist( double x1, double y1, double x2, double y2 ){double Dx,Dy;Dx=fabs(x1-x2);Dy=fabs(y1-y2);double dis;dis=sqrt(pow(Dx,2)+pow(Dy,2));return dis; }int sign( int x ){int res;if(x>0){res=1;}el…

使用 Java 解析验证码:结合 Tesseract OCR 进行文本识别

更多内容访问ttocr.com或联系1436423940环境准备 1.1 安装 Java如果尚未安装 Java,可前往 Oracle 官方网站 或 Adoptium 下载最新版本的 JDK。安装完成后,运行以下命令检查版本: java -version 1.2 安装 Tesseract …

代码大全2阅读笔记(2)

一、开篇:别让 “基础模块” 拖垮整体质量 读《代码大全 2》到编码实践章节时,最深刻的感受是:高质量代码不是靠 “高深技巧” 堆出来的,而是把 “变量、函数、控制结构” 这些基础模块做到极致。很多时候我们写的…

使用 Swift 进行验证码识别:集成 Tesseract OCR

环境准备 1.1 安装 Tesseract OCR 更多内容访问ttocr.com或联系1436423940 在 macOS 上可以使用 Homebrew 进行安装:brew install tesseract 安装完成后,检查 Tesseract 是否安装成功: tesseract --version 1.2 创建…

使用 Rust 进行验证码识别:结合 Tesseract OCR 进行文本解析

环境准备 1.1 安装 Rust如果尚未安装 Rust,可使用 Rust 官方安装工具 :更多内容访问ttocr.com或联系1436423940 curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh 安装完成后,检查 Rust 版本: rustc…

软件技术基本第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc这个作业的目标 实现文本计数统计姓名-学号 冯艳-2023329301103码云仓库地址:https://gitee.com/f2196470648/word-counter.git

Day7CSS的引入方式与选择器

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

ZR-J 2025-10-29 比赛总结

比赛链接 分数:\(100 + 100 + 0 + 0 = 200\) 永康喵喵又没有翻车! 有了前几次翻车的教训,我形成了先写注释(对于难题)\(\rightarrow\) 仔细写题 \(\rightarrow\) 静态检查 \(\rightarrow\) 动态检查 \(\rightarro…

newDay17

1.背了背单词,把u校园作业弄了,其他的没啥 2.明天看看Java那个期中考试怎么弄 3.最近有点摆

AI元人文架构:从价值计算到智能主体的演进路径

AI元人文架构:从价值计算到智能主体的演进路径 摘要: 本文系统阐述了基于Free Transformer潜变量Z的AI元人文架构,通过构建三值纠缠模型与语境主权机制,建立多层次价值博弈体系。研究提出价值递归架构和情感维度建…

三元组 - MKT

三元组 [62] B. Jiang, Y. Zhu, and M. Liu, “A triangle feature based map-tomap matching and loop closure for 2d graph slam,” in Proc. of the International Conference on Robotics and Biomimetics (ROBIO…

《代码大全2》观后感-理论与现实的桥梁

大二的课程表里,充满了《数据结构》、《统一建模语言》、《工程实训》等课程。我们学到了“链表”、“多态”、“软件生命周期”这些概念。它们很重要,但总感觉有些抽象,像飘在空中的云。而《代码大全2》,就是那股…

做题日志3

欸我去, 真得努力做题了, 感觉做题比上班有意思多了 arc187-b 做计数还是没有对双射的条件反射, 考虑每个连通块只需要计数左端点即可.

《代码大全2》观后感-从“码农”到“工匠”的第一课

在翻开《代码大全2》之前,我对编程的理解,很大程度上还停留在“解决问题”的层面。老师布置一个作业,我打开IDE,开始敲击键盘,直到程序能跑通、能输出正确结果,任务就完成了。我把自己定义为一个“码农”,一个熟…

[Windows] WSL使用指南

[Windows] WSL使用指南$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");DeepSeek生成(2025年10月29日23:07:15)目录🚀 WSL 常用命令速查安装与基本设置发…

Causal Language Models in NLP

Causal Language Models in NLP https://www.geeksforgeeks.org/nlp/causal-language-models-in-nlp/ Causal language models are a type of machine learning model that generates text by predicting the next wor…