Golang的Gin框架

目录

功能以及简单使用

gin.Engine数据结构

RouterGroup 

methodTrees

gin.context


功能以及简单使用

功能:

• 支持中间件操作( handlersChain 机制 )
• 更方便的使用( gin.Context )
• 更强大的路由解析能力( radix tree 路由树 )

简单使用:

gin.Default()创建一个gin Engine(http Handler)

http字段内容有:域名,数据长度,是否长连接,数据格式,压缩格式

Engine.Use : 注册中间件 常用的中间件有 :

Recover() 捕获异常

Log() 打印日志

Cors() 跨域的资源共享

Engine.POST() :  路由组注册 POST 方法下的 handler

Engine.Run() 启动 http server

import "github.com/gin-gonic/gin"func main() {// 创建一个 gin Engine,本质上是一个 http Handlermux := gin.Default()// 注册中间件mux.Use(myMiddleWare)// 注册一个 path 为 /ping 的处理函数mux.POST("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, "pone")})// 运行 http 服务if err := mux.Run(":8080"); err != nil {panic(err)}
}

gin.Engine数据结构

最重要的三个

RouterGroup 路由组 管理更方便

context 对象池   节约资源,避免重复创建,造成资源浪费

methodTrees 路由树 强大的路由解析

type Engine struct {// 路由组RouterGroup// ...// context 对象池pool             sync.Pool// 方法路由树trees            methodTrees// ...
}

RouterGroup 

RouterGroup 是路由组的概念,其中的配置将被从属于该路由组的所有路由复用

代码:

type RouterGroup struct {Handlers HandlersChainbasePath stringengine *Engineroot bool
}

解析:

HandlersChain:由多个路由处理函数 HandlerFunc 构成的处理函数链.

在使用的时候,会按照索引的先后顺序依次调用 HandlerFunc.

methodTrees

知识补充 前缀树和压缩前缀树

前缀树:

前缀树又称 trie 树,是一种基于字符串公共前缀构建索引的树状结构,核心点包括:

  • 除根节点之外,每个节点对应一个字符

  • 从根节点到某一节点,路径上经过的字符串联起来,即为该节点对应的字符串

  • 尽可能复用公共前缀,如无必要不分配新的节点

leetcode算法实现 208. 实现 Trie (前缀树) - 力扣(LeetCode)

示例:

压缩前缀树:

压缩前缀树又称基数树或 radix 树,是对前缀树的改良版本,优化点主要在于空间的节省,核心策略体现在:

倘若某个子节点是其父节点的唯一孩子,则与父节点进行合并

图中一下情况,就不能合并 如果合并那么 apple这个就会失效

 

如下才能压缩 

 

核心代码: 

 methodTree :

type methodTree struct {method stringroot   *node
}

node: 

type node struct {// 节点的相对路径path string// 每个 indice 字符对应一个孩子节点的 path 首字母indices string// ...// 后继节点数量priority uint32// 孩子节点列表children []*node // 处理函数链handlers HandlersChain// path 拼接上前缀后的完整路径fullPath string
}

node 是 radix tree 中的节点,对应节点含义如下:

  • path:节点的相对路径,拼接上 RouterGroup 中的 basePath 作为前缀后才能拿到完整的路由 path

  • indices:由各个子节点 path 首字母组成的字符串,子节点顺序会按照途径的路由数量 priority进行排序

  • priority:途径本节点的路由数量,反映出本节点在父节点中被检索的优先级

  • children:子节点列表

  • handlers:当前节点对应的处理函数链

补偿策略: 

将注册路由句柄数量更多的 child node 摆放在 children 数组更靠前的位置

当子节点越多时,优先级越高,因为更有可能匹配成功,也就是放在越左边,左子树先遍历

gin.context

gin.Context 作为处理 http 请求的通用数据结构,不可避免地会被频繁创建和销毁.

为了缓解 GC 压力,gin 中采用对象池 sync.Pool 进行 Context 的缓存复用

数据结构:

type Context struct {// ...// http 请求参数Request   *http.Request// http 响应 writerWriter    ResponseWriter// ...// 处理函数链handlers HandlersChain// 当前处于处理函数链的索引index    int8engine       *Engine// ...// 读写锁,保证并发安全mu sync.RWMutex// key value 对存储 mapKeys map[string]any// ..
}

 

处理流程:

http 请求到达时

从 pool 中获取 Context,倘若池子已空,通过 pool.New 方法构造新的 Context 补上空缺


http 请求处理完成后

将 Context 放回 pool 中,用以后续复用

sync.Pool

并不是真正意义上的缓存,将其称为回收站或许更加合适,放入其中的数据

逻辑意义上都是已经被删除的,但在物理意义上数据是仍然存在的,

这些数据可以存活两轮 GC 的时间,在此期间倘若有被获取的需求,则可以被重新复用.

(两分钟一轮GC)

func New() *Engine {// ...engine.pool.New = func() any {return engine.allocateContext(engine.maxParams)}return engine
}type any = interface{}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下的eclipse按Ctrl+Shift+F格式化代码不起作用的处理

1、先上张图: 上面Format:CtrlShiftF,按了以后不起作用。 2、这个快捷键不起作用的原因:可能是快捷键冲突了。 机器上装了Sougou输入法,将输入法切换为英文模式是起作用的。 那么应该就是这个原因了。 3、解决方法…

【Ardiuno】使用ESP32单片机创建web服务通过网页控制小灯开关的实验(图文)

经过实验测试ESP32单片机的网络连接还是很方便的,这里小飞鱼按照程序实例的代码亲自实验一下使用Esp32生成的网页服务来实现远程无线控制小灯开关功能,这样真的是离物联网开发越来越近了,哈哈! 连接好开发板和电路,将…

React入门教程:构建你的第一个React应用

在当今快速发展的Web开发领域,前端技术日新月异,而React作为一款强大的JavaScript库,已经成为众多开发者的首选。React以其组件化、高效的性能和灵活的数据处理机制闻名于世,被广泛用于构建动态且复杂的用户界面。在本教程中&…

Elixir学习笔记——输入输出和文件系统

本章介绍输入/输出机制、文件系统相关任务以及相关模块(如 IO、File 和 Path)。IO 系统提供了一个很好的机会来阐明 Elixir 和 Erlang VM 的一些思维模式和新奇思想。 输入输出模块 输入输出模块是 Elixir 中读写标准输入/输出 (:stdio)、标准错误 (:s…

Python中关于电商商品数据的采集【taobao/JD/商品详情数据返回】

在Python中采集电商商品数据(如淘宝、京东等)通常涉及到网络爬虫(web scraping)或称为网络数据抓取(web data scraping)。由于电商平台通常会有反爬虫机制,因此直接抓取数据可能会遇到各种挑战&…

基于51单片机的智能水表

一.硬件方案 本设计主要以51单片机作为主控处理器的智能水表,该水表能够记录总的用水量和单次用水量,当用水量超出设定值时系统发出声光报警提醒,水量报警值能够通过按键进行自行设置,并且存储于AT24C02中,并且可以测…

C++11默认成员函数控制

默认成员函数有 如果自己不显示声明,那么默认编译器会自己生成一个 如果有一个构造函数被声明了,那其他的默认函数编译器就不会再生成 这样的有时又不生成,容易造成混乱,于是C11让程序员可以控制是否需要编译器生成。 显式缺省函…

(虚拟机)VMware软件的安装及Ubuntu系统安装

一、VMware软件的安装 软件下载,可以自己找或者百度网盘下载: 通过百度网盘分享的文件:ubuntu16…等2个文件 链接:https://pan.baidu.com/s/1VEnZKY9DJ1T1vC3ae20gKQ 提取码:11b6 复制这段内容打开「百度网盘APP 即可获取」 1、解压VMwar…

06--jenkins构建CI_CD

前言:上一篇文章整理了git的部署和使用,这章主要复习持续集成软件Jenkins,这个技术现在在云计算方面也是有应用的,同时也是越高级越智能的软件代表。 1、概念简介 1)jenkins是什么 Jenkins是一个开源的、可扩展的持…

Linux 终端窗口设置为透明

Linux 终端窗口设置为透明 打开终端 右键鼠标 选择Profile Preferences 点击Background 选择 Transparent background 拖动滑条调整透明度 完成。

Nintex流程平台引入生成式人工智能,实现自动化革新

工作流自动化提供商Nintex宣布在其Nintex流程平台上推出一系列新的人工智能驱动改进。这些增强显著减少了文档化、管理和自动化业务流程所需的时间。这些新特性为Nintex流程平台不断扩展的人工智能能力增添了新的亮点。 Nintex首席产品官Niranjan Vijayaragavan表示&#xff1a…

甄嬛传熹贵妃上户口:如果让他陪你过冬天,那朕能不能睡中间?贝叶斯模型推导爸爸去哪儿

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 背景 《甄嬛传》是大家耳熟能详的宫廷剧,其中复杂的宫斗情节和深刻的人物刻画让人津津乐道。甄嬛因为与皇帝(四郎)闹翻了,去甘露寺待了一段时间&#x…

Navicat和SQLynx产品功能比较一(整体比较)

Navicat和SQLynx都是数据库管理工具,在过去的二十年中,国内用户主要是使用Navicat偏多,一般是个人简单开发需要,数据量一般不大,开发相对简单。SQLynx是最近几年的数据库管理工具,Web开发,桌面版…

PyTorch C++扩展用于AMD GPU

PyTorch C Extension on AMD GPU — ROCm Blogs 本文演示了如何使用PyTorch C扩展,并通过示例讨论了它相对于常规PyTorch模块的优势。实验在AMD GPU和ROCm 5.7.0软件上进行。有关支持的GPU和操作系统的更多信息,请参阅系统要求(Linux&#xf…

SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求? 一般当我们自己练习的时候,username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码,他跑到他的电脑打开navicat直接就是一顿连接,直接疯狂删除你的数据库,那可就废…

字符数组基础知识及题目

死识。。。 字符该如何存储呢?这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢? char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢? char a[100002]; gets(a); gets是读入句子的&#xff0c…

【第7章】Vue之第一个Vue程序(Vue创建)

文章目录 前言一、创建1. 命令行2. 创建3. 安装依赖 二、启动三、访问总结 前言 接下来我们通过VSCode来创建我们的第一个Vue应用程序。 一、创建 1. 命令行 Terminal>New Terminal 2. 创建 #这一指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工…

【Pr剪辑】工具栏的认识

目录 1.选择工具(快捷键V)1.1 选择1.2 移动素材1.3 框选1.4缩放1.5复制 2.钢笔工具(快捷键P)3.文字工具(T)4.剃刀(C )5.比例拉伸工具(R)6.波纹编辑工具&#…

HarmongOS打包[保姆级]

创建应用 首先进入 华为开发者联盟-HarmonyOS开发者官网 然后进行登录。 登录成功后,鼠标悬停在在登录右上角那个位置后再点击管理中心,进入下面这个界面。 再点击:应用服务–>应用发布–>新建–>完善信息 构建和生成私钥和证书请求…

惠海 H6213L降压恒压IC 支持3.3V5V12V30V40V60V100V电动车仪表供电稳压芯片方案

H6213L高压降压开关控制器是一款功性能良好的电源管理解决方案。它集成了众多先进的功能,使其在各种高压输入的应用场景中都能表现出色。 首先,H6213L具备高达150V的耐压能力,并支持高达120V的宽压输入范围。这意味着它可以轻松应对各种高压…