• 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

  • 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

Gin源码剖析

2024-08-14

介绍

Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务。官方地址:https://github.com/gin-gonic/gin。

使用

在项目中使用Gin也极其简单

  1. 下载gin: go get -u -v github.com/gin-gonic/gin

  2. import中引入”github.com/gin-gonic/gin”

  3. 核心代码

    r := gin.Default()

    r.GET(“/ping”, ping)

    r.Run(“:8080”)

  4. go run 后,浏览器输入http://localhost:9090/ping即可使用

  5. 可以使用热加载调试 工具:go get -v -u github.com/pilu/fresh - 执行fresh即可,代码有变动会自动编译程序

下面为整体演示代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package main

import (
"net/http"

ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"

_ "asap/docs"

"github.com/gin-gonic/gin"
)

// @Summary 接口探活
// @Produce json
// @Param lang query string false "en"
// @Success 200 {string} string "ok"
// @Router /ping [get]
func ping(c *gin.Context) {
c.String(http.StatusOK, "ok")
}

func main() {
r := gin.Default()
r.GET("/ping", ping)
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
v1 := r.Group("/v1")
{
v1.GET("/group", ping)
}
// Listen and Server in 0.0.0.0:8080
r.Run(":9090")
}

源码剖析

Gin代码量很少,使用 find . -name “*.go” | xargs cat | wc -l 查看后,在14K左右。我会从5个方面来进行解析

  • 结构简介:Gin使用的结构进行简单说明

  • 前期准备:Gin是如何将路由等信息组合起来的

  • 监听请求:Gin是如何开启服务,监听请求的

  • 请求处理:当请求到达时,Gin如何处理这些请求

  • 返回数据:处理完请求后,如何将数据返回给请求方

本文只是做简单的剖析,方便大家能够快速的理解和学习这个框架。

相关结构和流程图可参考:

https://www.processon.com/view/link/5e36f9efe4b0d27af1852f3b

https://www.processon.com/view/link/5e3fc3d8e4b06b291a662a26

结构简介

本节主要给大家介绍一下Gin使用的核心数据结构或者接口,其中有些图画的不太准确,不过不影响理解。

  1. Engine:Engine里有三个非常重要的数据
    • RouterGroup:使用Handlers存放中间件,另外提供设置路由的功能
    • pool:主要用于从池中获取或者存放Context,减少GC
    • trees:主要用于存放路由信息和该路由对应的处理函数列表,每个HTTP方法(GET POST等)都有单独的tree

  1. Context:主要接收server传递过来的http.Request和http.Response,并对这两个数据进行处理

四个流程

红色为前期准备,绿色为监听请求,紫色为请求处理,粉色为返回数据。如果图片不清晰,可查看 https://www.processon.com/view/link/5e36f9efe4b0d27af1852f3b

说明

  1. 学习完Gin框架,我们自己也可以制作简单的go-web框架。go在语言层面帮我们解决了很多重复性的工作,实在是一门有理想有追求的语言。
  2. 本文章只是简单的讲解,最好的剖析还是源码本身。

参考资料

使用

  1. https://geektutu.com/post/quick-go-gin.html Go Gin 简明教程

  2. https://github.com/gin-gonic/gin 源码

  3. https://gin-gonic.com/zh-cn/docs/ 中文文档

  4. https://www.kancloud.cn/shuangdeyu/gin_book/949436 gin中文文档

源码

  1. https://www.jianshu.com/p/35addb4de300

  2. https://www.cnblogs.com/yjf512/p/9670990.html

  3. https://www.cnblogs.com/sunsky303/p/9706210.html sync.Pool详解

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

扫一扫,分享到微信

微信分享二维码
Gin框架简洁版
Gin框架集成swagger过程
© 2025 John Doe
Hexo Theme Yilia by Litten