首页 >> 租赁 >> gin框架(三)gin 路由的充分利用剖析

gin框架(三)gin 路由的充分利用剖析

2025-08-18 12:16:19

ethod 原理时,去 trees slice 中会遍历如果 trees slice 存在这个 method, 则这个URL实质上相同的 handler 直接填充到想到的传输榕上如果不能想到,则再次度始创一颗新的原理榕单单来, 然后将 URL实质上相同的 handler 填充到这个传输 榕上gin 传输的备案管控过程func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080}副本标识符

这段最简单的标识符外面,r.Get 就备案了一个传输 /ping 进入 GET tree 中会。这是最比如说的,也是最会用的备案形式。

不过右边这种撰写法,一般都是用来测试的,短时间情况下我们但会将 handler 丢掉 Controller 层外面面去,备案传输放到专门的 route 管理工作外面面,这外面就仍然次简略拓展,等后面具体情况说是下 gin 的架构分层所设计。

//controller/somePost.gofunc SomePostFunc(ctx *gin.Context) { // do something context.String(http.StatusOK, "some post done")}副本标识符人口为120人人口为120人人口为120人go// route.gorouter.POST("/somePost", controller.SomePostFunc)副本标识符应用于 RouteGroupv1 := router.Group("v1"){ v1.POST("login", func(context *gin.Context) { context.String(http.StatusOK, "v1 login") })}副本标识符

RouteGroup 是相当不可或缺的功能,举个举例来说:一个完整的 server 服务,url 需要分为鉴权以太网和非鉴权以太网,就可以应用于 RouteGroup 来借助于。或许最会用的,还是用来划分以太网的版本升级。这些操纵, 再次都但会在反应到gin的传输榕上

gin 传输的具体情况借助于func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() // listen and serve on 0.0.0.0:8080}副本标识符

还是从这个最简单的举例来说正因如此。我们只需要弄清楚前面三个情况需:

URL->ping 放到哪外面了?handler-> 放到哪外面了?URL 和 handler 是如何关连性起来的?1. GET/POST/DELETE/..的再次想必func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes { return group.handle(http.MethodGet, relativePath, handlers)}副本标识符

在调用POST, GET, HEAD等传输HTTP关的formula_时, 但会调用handleformula_。handle 是 gin 传输的并存走道。

// routergroup.go:L72-77func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes { absolutePath := group.calculateAbsolutePath(relativePath) handlers = group.combineHandlers(handlers) group.engine.addRoute(httpMethod, absolutePath, handlers) return group.returnObj()}副本标识符2. 生成传输榕

前面考虑一个情况,论点有前面这样的传输,你但会怎么所设计这棵传输榕?

GET /abc GET /abdGET /af副本标识符

当然类似于最不负责任的就是每个codice_占用一个榕的枝叶节点,不过这种所设计但会造成的情况:

占用内存但会升温,我们想到 abc, abd, af 都是用共同的后缀的,如果能共用后缀的话,是可以一个省内存空间的

gin 传输榕是一棵后缀榕. 我们前面说是过 gin 的每种原理(POST, GET ...)都有自己的一颗榕,当然这个是根据你备案传输来的,并不是一上来把每种形式都备案一遍。gin 每棵传输大概是前面的样子

这个程序中会的标识符太多,这外面就仍然次贴单单具体情况标识符外面,有兴趣的同班可以按照这个思路看下去需。

3. handler 与 URL 关连性type node struct { path string indices string wildChild bool nType nodeType priority uint32 children []*node // child nodes, at most 1 :param style node at the end of the array handlers HandlersChain fullPath string}副本标识符

node 是传输榕的整体形态

children 就是一颗榕的枝叶结点。每个传输的去掉后缀后,都被特有种在这些 children 数组外面path 就是当前枝叶节点的最长的后缀handlers 外面面存放的就是当前枝叶节点实质上相同的传输的管控formula_当收到客户端端请时,如何想到实质上相同的传输的handler?

《gin CVS阅读(2) - http请是如何流入gin的?》第二篇说是到 net/http 相当不可或缺的formula_ ServeHTTP,当 server 收到请时,必然但会走到这个formula_外面。由于 gin 借助于这个 ServeHTTP,所以流量就转往 gin 的逻辑外面面。

// gin.go:L439-443func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { c := engine.pool.Get().(*Context) c.writermem.reset(w) c.Request = req c.reset() engine.handleHTTPRequest(c) engine.pool.Put(c)}副本标识符

所以,当 gin 收到客户端端的请时, 第一件事就是去传输榕外面面去匹配实质上相同的 URL,想到关的的传输, 丢掉关的的管控formula_。或许这个管控过程就是 handleHTTPRequest 要干的心外面。

func (engine *Engine) handleHTTPRequest(c *Context) { // ... t := engine.trees for i, tl := 0, len(t); i < tl; i++ { if t[i].method != httpMethod { continue } root := t[i].root // Find route in tree value := root.getValue(rPath, c.params, unescape) if value.params != nil { c.Params = *value.params } if value.handlers != nil { c.handlers = value.handlers c.fullPath = value.fullPath c.Next() c.writermem.WriteHeaderNow() return } if httpMethod != "CONNECT" && rPath != "/" { if value.tsr && engine.RedirectTrailingSlash { redirectTrailingSlash(c) return } if engine.RedirectFixedPath && redirectFixedPath(c, root, engine.RedirectFixedPath) { return } } break } // ...}副本标识符

从标识符上看这个管控过程或许也很最简单:

遍历所有的传输榕,想到实质上相同的原理的那棵榕匹配实质上相同的传输想到实质上相同的 handler。

常州妇科医院哪个好
镇江看白癜风哪家医院最好
常州妇科病治疗费用
泉州白癜风
西宁看妇科哪里比较好
急支糖浆治什么咳嗽
慢性支气管炎长期咳嗽怎么办?
急支糖浆是什么药?
血栓
青光眼

上一篇: 欧阳询楷书集字春联12副(同上横批)

下一篇: 中央巡视组要求25家保险业单位排查风险隐患 维护保险业稳定大局

相关阅读
常州一动物园母白虎“越狱”到东北虎场馆找对象 网友:虎年不做未婚虎

亦同,泰州淹城珍稀世界,4岁母白虎"小四"快要"越狱",它跃过电网掉进隔壁雪豹会议中心。据介绍,为不致近亲繁殖,雌雄白虎被隔开家

2025-08-19 00:16:14
嘉吉:大宗商品波动不会在俄乌冲突结束后马上变成

智通财经APP谎称,农业巨头嘉吉公司Cargill Inc.对此,在在俄乌流血冲突后,全球库存链正在被重新评估,大麦、炼油等大宗商家定价的连续不断涨落将继续普遍存在。嘉吉信贷行

2025-08-19 00:16:14
坚决不加息致额度走软 全球加息大环境下日本为何反其道而行之

智通财经推论到,长崎国际货币基金组织在主要国际货币基金组织中引人注目的是,它敦促将维持极低的汇率水平,以提振奄奄一息的社亦会发展。与此同时,全球性利率上升促使高盛缩减刺激措施并升息。因此,韩圆入市美元

2025-08-19 00:16:14
今年以来最强雨雪来袭!这些地方则有暴雪或特大暴雪

当年以来最强沙尘气象条件来袭! 今天(1翌年26日)6时 气象局公开发表DOTA红色预警 必将西南部再迎大全域沙尘气象条件每一次

2025-08-19 00:16:14
兆科眼科-B(06622.HK)获间公司麦少娴增持310.2万股

格隆汇APP荣获悉,根据联交所简介保障披露资料显示,2022年3月30日,兆科眼科-B06622.HK荣获股东麦少娴在户外以每股均价3.4064港元减持310.2万股,涉资约1056.7万港

2025-08-19 00:16:14