Gin基本使用-原理篇
创始人
2025-06-01 12:03:12
0

扩展知识:

go mod

类似于我们Python的pip做依赖管理的,每个项目可能都会使用一些外部包,外步包有很多版本
  • go mod就是帮助我们自动管理你们的包和版本号的
  • 如果没有go mod别人如何才能运行你们的代码

外部的包:其他人封装好的,实现特定功能的代码

常用命令: go get github.com/gin-gonic/gin // 将GitHub上,或者其他仓库里的代码下载到本地,直接导入 就可以是用了。 go mod tidy // 更新我们的依赖(第一次运行项目,执行这个命令他会将项目中所有的外部包 一次性的全部下载到本地

Gin入门


1. 介绍

Gin是一个golang的微框架(只处理api),封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点(beego很重,前端后端都写在框架里面,同时还自带数据库框架) 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的 net/http 足够简单,性 能也非常不错(当不需要去写web站点的时候,如很多的平台,那么就不需要用到web框架。用go自身携带的这些包就可以写日常的一些脚本了) 借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。 2. 快速写一个
package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)func main() {fmt.Println(gin.Version)// 1.创建 (实例化gin.Engine结构体对象)g := gin.Default()// 2.绑定路由规则,执行的函数//gin.Context,封装了request和response,之后的请求和响应直接使用context就可以实现g.GET("/", func(context *gin.Context) {context.String(http.StatusOK, "hello world")})// 3.监听端口,默认在8080//Run("里面不指定端口号默认为8080")g.Run()
}

Gin工作流程


1. 核心概念
  • Engine 容器对象,整个框架的基础
  • Engine.trees 负责存储路由和handle方法的映射,采用类似字典树的结构(一个存储路由和方法的地方)
  • Engine.RouterGroup ,其中的Handlers存储着所有中间件
  • Context 上下文对象,负责处理 请求和回应 ,其中的 handlers 是存储处理请求时中间件和处理方法的(在使用http包的时候,在写handler方法对时候要去写 http response request这些,因为要去从request里面去拿请求的参数,或者header,在响应的时候是使用的是response writer,那么其实context其实就是封装了r和w)

gin.Default会去new一个gin的实例,然后再去Use中间件。

之后去注册路由的时候将路由加入到路由树里面。

最后r.run其实就是调用了http.ListenAndServe(":8081", nil)

2. 请求处理流程

首先会去看看有没有中间件,如果有它会先去处理中间件,其实也就是实际处理路由之前需要处理的。其实也就是放了一个全局的拦截器,过滤器。先要处理完发过来的信息,处理完之后传给下一层。

经过中间件处理完之后会去丢给具体处理的哪个路由,哪个url,匹配到了之后再去处理handler方法。handler里面具体的逻辑就是大家去写,比如是否要去连接数据库。

处理完之后,再去返回给中间件去做一层处理,可能有有可能没有。中间件处理完之后再去将这个结果返回给用户。

总结:接收到消息之后不是立刻路由处理,首先是中间件处理,先过一层中间件,中间件处理完毕之后再到路由,处理完之后再到handler的业务处理逻辑,无论是你去连接redis还是mysql都根据你的需求去写。handler处理完之后再去给中间件去处理。

大部分情况下可能只有一层中间件,返回的时候是不需要的。

Gin原理解析


参考资料:http://v5blog.cn/pages/dd7d5a/ 1. 先看 gin.Default() Default()跟New()几乎一模一样, 就是调用了gin内置的Logger(), Recovery()中间件
// Default返回一个已经附加了Logger和Recovery中间件的Engine实例
func Default() *Engine { debugPrintWARNINGDefault() engine := New() // 默认实例,默认实例是不会去注册中间件的// 注册中间建,中间件的是一个函数,最终只要返回一个 type HandlerFunc func(*Context) 就以 engine.Use(Logger(), Recovery())  //一个是日志中间件和处理Panic的// 默认注册的两个中间件 return engine 
}

2. engine := New() 初始化

通过调用 gin.New() 方法来实例化 Engine容器 .
  1. 初始化了Engine
  2. 将RouterGroup的Handlers(数组,存放中间件和处理函数的)设置成nil, basePath设置成 /
  3. 为了使用方便, RouteGroup里面也有一个Engine指针, 这里将刚刚初始化的engine赋值给了 RouterGroup的engine指针
  4. 为了防止频繁的context GC造成效率的降低, 在Engine里使用了sync.Pool, 专门存储gin的 Context(当你去写了api接口,你会接受到很多的请求,你写的这些接口是都需要去使用的,那么每一个请求就有一个context上下文,因为每个请求对request和response都可能不一样,这些上下文通过sync.pool去处理,避免大量的内存消耗。常用的上下文存在sync.pool里面,要使用的话直接在内存池里面去拿,如果长期不使用它会帮你自动释放,可以理解为自动对垃圾回收)
func New() *Engine { debugPrintWARNINGNew() // Engine 容器对象,整个框架的基础 engine := &Engine{ // 初始化语句 // Handlers 全局中间件组在注册路由时使用 RouterGroup: RouterGroup{ // Engine.RouterGroup,其中的Handlers存储着所有中间件                             Handlers: nil, //没有任何处理方法和中间件的,注册路由和注册中间件都是在注册路由之后加上的basePath: "/", root: true, 
}, // 树结构,保存路由和处理方法的映射,这里会存储9种请求方法对,根据每种请求方法分开trees: make(methodTrees, 0, 9), 
}engine.RouterGroup.engine = engine return engine //初始化完成之后,它又将初始化实例放到结构体里面了
}

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...