首页 >> 租赁 >> 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家保险业单位排查风险隐患 维护保险业稳定大局

相关阅读
民宿在线住押金2万逾期近2年不退,常州:建议司法途径维权

后能返还。我暂定了6月底5号绍兴的别墅九份,偿还债务路费8800元,还有一笔批次是6月底12号,暂定了金华的一栋别墅, 并偿还债务路费6800元。和平台当初承诺三天之内索要路费,但直到现在都没后撤。我

2025-11-01 00:16:17
排污口监督管理出台顶层设计者 生态环境部:对入河入海排污口“有口皆查、应查尽查”

式,执意“有口皆查、应查尽查”,应用了一些高科技,也下足了大福功夫,因为每一个都是到现场徒步核查,摸清了淮河、渤海国等试点管理工作邻近地区的排污口自然数。 其之前,辨认出淮河退河排污口6

2025-11-01 00:16:17
交广会客厅|太原铁路加强非典型肺炎防控服务清明小长假出行

交广会客厅|晋阳铁路加强禽流感联合国开发计划署服务冬至小长假提供方便 4月3日至5日,冬至小长假在此期间,近现代铁路晋阳局内的公司香港)有限公司切实从紧抓好站车禽流感联合国开发计

2025-11-01 00:16:17
美国调查人员称俄的政府正在转移资产以躲避制裁

英国财政部近期成立的、督导处理对俄默许的值得注意工作组督导人4月初1日表示,英国警察局长发现,有确凿证据断定哈萨克斯坦实质上仍要转移存款竭力逃过欧美国家默许。 据华尔街日报4月初

2025-11-01 00:16:17
四川成都新增本土确诊病例2例,无症状猫狗3例

央广网遵义4月底2日消息(记者 昌思荣)4月底2日晚,都江堰市人民政府新闻办公室举行疫情防控工作新闻发布会,核查疫情最新防控情形。 据了解,4月底2日0到18时,都江堰市新增本土确

2025-11-01 00:16:17