Gin 框架的路由结构浅析

2023-05-16

Gingo 语言的一款轻量级框架,风格简单朴素,支持中间件,动态路由等功能。 gin项目github地址

路由是web框架的核心功能。在没有读过 gin 的代码之前,在我眼里的路由实现是这样的:根据路由里的 / 把路由切分成多个字符串数组,然后按照相同的前子数组把路由构造成树的结构;寻址时,先把请求的 url 按照 / 切分,然后遍历树进行寻址。

比如:定义了两个路由 /user/get/user/delete,则会构造出拥有三个节点的路由树,根节点是 user,两个子节点分别是 get delete

上述是一种实现路由树的方式,且比较直观,容易理解。对 url 进行切分、比较,时间复杂度是 O(2n)

Gin的路由实现使用了类似前缀树的数据结构,只需遍历一遍字符串即可,时间复杂度为O(n)

当然,对于一次 http 请求来说,这点路由寻址优化可以忽略不计。

Engine

GinEngine 结构体内嵌了 RouterGroup 结构体,定义了 GETPOST 等路由注册方法。

Engine 中的 trees 字段定义了路由逻辑。treesmethodTrees 类型(其实就是 []methodTree),trees 是一个数组,不同请求方法的路由在不同的树(methodTree)中。

最后,methodTree 中的 root 字段(*node类型)是路由树的根节点。树的构造与寻址都是在 *node的方法中完成的。

UML 结构图
engine结构图

trees 是个数组,数组里会有不同请求方法的路由树。

tree结构

node

node 结构体定义如下

type node struct {
    path      string           // 当前节点相对路径(与祖先节点的 path 拼接可得到完整路径)
    indices   string           // 所以孩子节点的path[0]组成的字符串
    children  []*node          // 孩子节点
    handlers  HandlersChain    // 当前节点的处理函数(包括中间件)
    priority  uint32           // 当前节点及子孙节点的实际路由数量
    nType     nodeType         // 节点类型
    maxParams uint8            // 子孙节点的最大参数数量
    wildChild bool             // 孩子节点是否有通配符(wildcard)
}

path 和 indices

关于 pathindices,其实是使用了前缀树的逻辑。

举个栗子:
如果我们有两个路由,分别是 /index/inter,则根节点为 {path: "/in", indices: "dt"...},两个子节点为{path: "dex", indices: ""},{path: "ter", indices: ""}

handlers

handlers里存储了该节点对应路由下的所有处理函数,处理业务逻辑时是这样的:

func (c *Context) Next() {
    c.index++
    for s := int8(len(c.handlers)); c.index < s; c.index++ {
        c.handlers[c.index](c)
    }
}

一般来说,除了最后一个函数,前面的函数被称为中间件

如果某个节点的 handlers为空,则说明该节点对应的路由不存在。比如上面定义的根节点对应的路由 /in 是不存在的,它的 handlers就是[]

nType

Gin 中定义了四种节点类型:

const (
    static nodeType = iota // 普通节点,默认
    root       // 根节点
    param      // 参数路由,比如 /user/:id
    catchAll   // 匹配所有内容的路由,比如 /article/*key
)

paramcatchAll 使用的区别就是 :* 的区别。* 会把路由后面的所有内容赋值给参数 key;但 : 可以多次使用。
比如:/user/:id/:no 是合法的,但 /user/*id/:no 是非法的,因为 * 后面所有内容会赋值给参数 id

wildChild

如果孩子节点是通配符(*或者:),则该字段为 true

一个路由树的例子

定义路由如下:

r.GET("/", func(context *gin.Context) {})
r.GET("/index", func(context *gin.Context) {})
r.GET("/inter", func(context *gin.Context) {})
r.GET("/go", func(context *gin.Context) {})
r.GET("/game/:id/:k", func(context *gin.Context) {})

得到的路由树结构图为:
路有树

附一篇前缀树的文章,前缀树和后缀树


图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gin 框架的路由结构浅析 的相关文章

  • go的gin框架的性能测试

    最近可能想用用gin框架 xff0c 刚好在studygolang网站上看到一篇文章 xff0c 一个小伙测试gin的性能 所以想看看性能 我想把php xff0c 原生的golang的http包 xff0c gin框架一起在本地做个测试
  • Gin框架 ShouldBindJSON详解

    为什么第二次使用ShouldBindJSON就失效了呢 今天debug看了下 xff0c 主要是 http Request的io buffer第一次取完之后 xff0c http body 结构体中的sawEOF 61 true 第二次去读
  • go语言gin框架使用for渲染html表格数据

    效果 源码 go span class token keyword type span data span class token keyword struct span span class token punctuation span
  • gin跨域时Get,Post正常Put,Delete被阻止的问题解决

    问题表现 同一个项目请求同一个服务时 xff0c Get和Post请求正常 xff0c 但是Put和Delete一直报跨域错误的问题 Access to XMLHttpRequest at 39 http 127 0 0 1 8011 ap
  • gin 框架原理

    Gin的路由原理 Gin的路由基于Trie树和压缩字典树算法 xff0c 什么是Trie树 xff1f 其实很好理解 xff0c 看下图 xff1a 单词at xff0c bee xff0c ben xff0c bt xff0c q组成的T
  • go语言gin、net/http的优雅关机

    gin net http的优雅关机 什么是优雅关机 xff1f 优雅关机的实现参考链接 什么是优雅关机 xff1f http server运行过程中 xff0c 若进程被关闭 xff0c 那么正在处理的请求可能只被处理了一半就停止了 xff
  • go web gin框架实战1

    文章目录 go web gin框架实战1 参考资料2 demo3 demo运行4 demo解析 go web gin框架实战 1 参考资料 gin框架官方文档 链接 2 demo span class token keyword packa
  • go集成gin处理error

    1 gin的使用 gin在go开发web的占比是挺大的 很好用的web框架 xff0c 简单快速高效 但是呢 xff0c 在使用gin的过程中 xff0c 如何去统一去处理error和数据返回给客户端呢 xff1f 原始的做法如下 xff1
  • go语言使用gin框架

    gin框架基础用法 package main import github com gin gonic gin net http func main router gin Default router LoadHTMLGlob templat
  • Gin微服务框架_golang web框架_完整示例Demo

    Gin简介 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Gin是一个golang的微框架 封装比较优雅 API友好 源码注释比较明确 具有快速灵活 容错方便等特点 其实对于golang而
  • Go语言学习(八)-- Gin入门

    Gin 是一个 Go Golang 编写的轻量级 http web 框架 运行速度非常快 Gin 最擅长的就是 Api 接口的高并发 如果项目的规模不大 业务相对简单 这个时候我们 也推荐您使用 Gin 当某个接口的性能遭到较大挑战的时候
  • golang gin框架 Context自定义拓展

    golang gin框架 Context自定义拓展 有些时候会遇到gin Context自带属性或方法无法满足开发需求的情况 可以对gin Context进行一定的拓展和自定义 大致拓展效果如下 可以新增属性和方法 func main se
  • GinCMS 使用golang Gin框架xorm开发的小型内容管理系统

    系统介绍 服务器端 使用GoLang 基于Gin框架 MySQL数据库 用到的组件xorm 前端展示 使用基于LayUI的layuicms 用到的第三方组件authtree treeTable GinCMS是我学习golang 使用Gin开
  • gin 六.重定向路由重定向与请求转发

    目录 一 重定向与请求转发基础解释 二 重定向 gin Context Redirect 内部 外部重定向 路由重定向 三 请求转发 一 重定向与请求转发基础解释 重定向和请求转发是两种常见的HTTP请求处理方式 它们都可以实现将请求从一个
  • golang web开发

    目录 文章目录 前言 一 golang web是什么 二 搭建流程 1 模块划分 2 详细开发步骤 总结 前言 例如 习惯了java springboot 开发方式 比较疑惑golang web开发的流程和模块化的区分 就golang we
  • Docker运行gin项目(go mod)

    准备 先在本地把golang的docker镜像拉取下来 docker pull golang Dockerfile文件内容 在gin项目根目录下创建Dockerfile配置文件 指定基础镜像 FROM golang 维护人信息 MAINTA
  • gin http-request

    func main router gin Default router POST form post message func c gin Context 查询请求URL后面拼接的参数 id c Query id 从取得URL中参数 此处U
  • Gin中的Cookie和Session的用法

    Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法 介绍 Cookie 代码演示 Session 代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术 主要用于
  • go 进阶 gin实战相关: 五. gin_scaffold 企业脚手架

    目录 一 gin scaffold 企业级脚手架 二 gin scaffold 脚手架安装及使用演示 文件分层解释 开始使用 1 配置开启go mod 功能 2 下载 安装 gin scaffold 3 整合 golang common 4
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成

随机推荐

  • H3C配置日志主机

    华三网络设备信息级别共有8级 xff0c 从高到底分别为emergencies alerts critical errors warnings notifications infomational debugging 信息级别数值描述eme
  • MIUI11系统怎么样刷入开发版获得Root超级权限

    小米的手机或平板不同手机型号一般情况下官网都提供两个不同的安卓系统版本 xff0c 可分为稳定版和开发版 xff0c 稳定版没有提供root权限管理 xff0c 开发版中就开启了root权限 xff0c 很多时候我们需要使用的一些功能强大的
  • 一起来看React(路由守卫)

    我们在很多时候都会接触到路由守卫 gt 无论是不是做 代码小子 的人 我们在浏览各网页时会看到头部的网址 如 xff1a 当我们在逛 xff1a 淘宝 天猫 京东 这一类的网站时我们自定义输入地址时 我们应该先登录 如果没登录我们应该跳转到
  • filezilla无法启动传输及严重文件传输错误

    filezilla无法启动传输 严重文件传输错误 文件夹权限不够 xff0c 修改之 你的空间或服务器已经满了 xff0c 请空下回收站或者扩容 文件正在被占用 xff0c 关闭后传输 转载于 https www cnblogs com w
  • 用KeyTool生成安全证书

    详细请见 xff1a Tomcat的帮助文档 xff0c xff1a https localhost 8080 tomcat docs ssl howto html 1 用keytool 生成证书 xff1a keytool genkey
  • Scheduling and emailing PeopleSoft Query results

    You could E Mail the Query results by embedding the paramters in a nVision Layout Create a Tabular nVision Layout Add th
  • VS2022 添加 dll 库文件

    参考链接 Visual Studio中的C 43 43 程序如何使用第三方静态库和动态库 xff1f 掘金 1 xff0c 添加库文件路径 在 Visual Studio 2022 中 xff0c 可以通过在项目属性页面中添加库文件的目录
  • OD常用断点(转载)

    常用断点 OD中 拦截窗口 xff1a bp CreateWindow 创建窗口 bp CreateWindowEx A 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowTe
  • Linux curl 命令模拟 POST/GET 请求

    curl 命令 xff0c 是一个利用URL规则在命令行下工作的文件传输工具 curl 支持文件的上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称curl为下载工具 作为一款强力工具 xff0c curl
  • WINserver路由服务之多网段管控

    前几天 xff0c 看见了一个朋友写的一篇文章 实现win2003路由功能 看了之后的感觉是 xff0c 只写了路由功能的安装部分 xff0c 对于功能实现之后的应用 xff0c 没怎么谈到 于是跟他交流了一下下 然后也建议他来看看我的那篇
  • ubuntu环境下实现 多线程的socket(tcp) 通信

    改改就是个小型局域网聊天 服务器端 xff1a 1 File Name process server c 2 Author jiujue 3 Created Time 2019年03月10日 星期日 20时29分18秒 4 5 includ
  • cpptools-srv占用内存过大_iOS“其他内存”占用过大问题分析

    今天遇到了一个有趣的关于iPhone 占用内存过大的问题 xff0c app与正常使用内存没问题 xff0c 但莫名多了很多其他内存 手机只有64g但其他占了50g 首先百度一波 xff0c 得到的答案无一是还原出厂设置 xff0c 抹掉所
  • nginx限制客户端请求数+iptables限制TCP连接和频率来防止DDOS

    DDOS的特点是分布式 xff0c 针对带宽和服务 xff0c 即四层流量 和七层应用 对于七层的应用 xff0c 如果前端是Nginx xff0c 主要使用nginx的http limit conn和http limit req模块来防御
  • Android带图片的Toast(自定义Toast)

    使用Android默认的Toast Toast简介 xff1a Toast是一个简单的消息显示框 xff0c 能够短暂的出现在屏幕的某个位置 xff0c 显示提示消息 默认的位置是屏幕的下方正中 xff0c 一般Toast的使用如下 xff
  • XML CDATA是什么?

    解析数据 XML 解析器通常情况下会处理XML文档中的所有文本 当XML元素被解析的时候 xff0c XML元素内部的文本也会被解析 lt message gt This text is also parsed lt message gt
  • TCP端口同时做服务器与客户端

    下面的代码主要实现两个功能 xff1a 1 xff0c 通过bind使本机指定端口如2012端口与远端服务器通信 xff0c 不指定的话会随机分配 2 xff0c 然后使用该指定端口创建监听服务 xff0c 接受其他客户端的连接 主要方法用
  • bat脚本禁用和开启本地连接

    netsh interface set interface name 61 34 本地连接 34 admin 61 disabled 禁用本地连接 netsh interface set interface name 61 34 本地连接
  • 一个PHP的QRcode类,与大家分享

    类的代码 View Code lt php eval gzinflate base64 decode 39 7X1td9s2svDn3nP2PzBZNZJiKRb1ZtmxvY 43 bOE3u2o5rp9u7N5v1oSTaZqO3UHQ
  • Java程序员的黄金5年,从入行到大牛的晋升之路

    在程序界流行着一种默认的说法叫 黄金5年 xff0c 也就是一个程序员从入职的时候算起 xff0c 前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向 xff0c 如何走好这5年 xff0c 彻底从一个刚入行的菜鸟蜕变成可以以不变
  • Gin 框架的路由结构浅析

    Gin 是 go 语言的一款轻量级框架 xff0c 风格简单朴素 xff0c 支持中间件 xff0c 动态路由等功能 gin项目github地址 路由是web框架的核心功能 在没有读过 gin 的代码之前 xff0c 在我眼里的路由实现是这