介绍

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
package main
2

3
import (
4
	"net/http"
5

6
	ginSwagger "github.com/swaggo/gin-swagger"
7
	"github.com/swaggo/gin-swagger/swaggerFiles"
8

9
	_ "asap/docs"
10

11
	"github.com/gin-gonic/gin"
12
)
13

14

15
// @Produce  json
16
// @Param lang query string false "en"
17
// @Success 200 {string} string "ok"
18
// @Router /ping [get]
19
func (c *gin.Context) {
20
	c.String(http.StatusOK, "ok")
21
}
22

23
func main() {
24
	r := gin.Default()
25
	r.GET("/ping", ping)
26
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
大专栏  gin源码剖析="gutter">
27
	v1 := r.Group("/v1")
28
	{
29
		v1.GET("/group", ping)
30
	}
31
	// Listen and Server in 0.0.0.0:8080
32
	r.Run(":9090")
33
}

源码剖析

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使用的核心数据结构或者接口,其中有些图画的不太准确,不过不影响理解。

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

  • 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/ 中文文档

源码

  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源码剖析的更多相关文章

  1. gin 源码阅读(5) - 灵活的返回值处理

    gin 源码阅读系列文章列表: gin 源码阅读(1) - gin 与 net/http 的关系 gin 源码阅读(2) - http请求是如何流入gin的? gin 源码阅读(3) - gin 路由 ...

  2. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  3. Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

    声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...

  4. Apache Spark源码剖析

    Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著   ISBN 978-7-121-25420- ...

  5. 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析

    项目简单说明 mybatis-generator,是根据数据库表.字段反向生成实体类等代码文件.我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去 ...

  6. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  7. SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现

    SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...

  8. 自己实现多线程的socket,socketserver源码剖析

    1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...

  9. Java多线程9:ThreadLocal源码剖析

    ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...

随机推荐

  1. Docker部署freeswitch

    1. clone配置文件到本地服务器 git clone https://github.com/BetterVoice/freeswitch-container.git 相关Dockerfile如下: ...

  2. 吴裕雄--天生自然Linux操作系统:Linux 文件基本属性

    Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限.为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定. 在Linux中我们可 ...

  3. PAT Basic 1017 A除以B (20) [数学问题-⼤整数运算]

    题目 本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成⽴. 输⼊格式: 输⼊在1⾏中依次给出A和B,中间以1空格分隔. ...

  4. node/静态路由/express框架中的express.static()和app.use()

    此篇文章转载于 express框架中的express.static()和app.use() Express框架在使用app.use中传入express.static设置静态路由时,这个文件夹下的所有文 ...

  5. 针对Oracle的一系列操作

    一.有关于数据库导出dmp的语句. 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中exp system/manager@TEST file=d ...

  6. 记录一次追踪@AutoWired的过程

    目录 记录一次追踪@AutoWired的过程 前言 疑惑:依赖究竟是怎么自动注入的 AutoWiredAnnotationBeanPostProcessor中探究 自动注入debug流程追踪 dete ...

  7. 用Plotily处理数据的基本操作

    import pandas as pd # 导入数据.scv df = pd.read_csv(" .csv") # 查看前五行数据 df.head() # 查看一下数据描述 df ...

  8. C# 使用 HttpPost 请求调用 WebService (转)

    转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...

  9. 让debian8.8不休眠,debian设置不休眠模式,因为我的本本休眠了时间不准确了,得重新同步

    第一步:sudo vi /etc/systemd/logind.conf /*最好备份下再修改*/ 把下面的参数改为ignoreHandleLidSwitch=ignore 第二步: sudo ser ...

  10. Nginx_安全2

    Nginx与安全有关的配置 隐藏版本号 http {    server_tokens off;} 经常会有针对某个版本的nginx安全漏洞出现,隐藏nginx版本号就成了主要的安全优化手段之一,当然 ...