Golang的Gin框架

news2024/11/24 23:12:14

目录

功能以及简单使用

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 Handler
    mux := 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 HandlersChain
    basePath string
    engine *Engine
    root bool
}

解析:

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

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

methodTrees

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

前缀树:

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

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

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

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

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

示例:

压缩前缀树:

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

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

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

 

如下才能压缩 

 

核心代码: 

 methodTree :

type methodTree struct {
    method string
    root   *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 响应 writer
    Writer    ResponseWriter
    // ...
    // 处理函数链
    handlers HandlersChain
    // 当前处于处理函数链的索引
    index    int8
    engine       *Engine
    // ...
    // 读写锁,保证并发安全
    mu sync.RWMutex
    // key value 对存储 map
    Keys 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.coloradmin.cn/o/1840171.html

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

相关文章

系统状态检测命令

1.ifconfig用于获取网卡配置与网络状态等信息 [rootlinuxprobe Desktop]# ifconfig eno16780032: flags4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:0c:29:90:17:bb txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 fra…

2024年了,C++还值得学吗?6个C++的就业方向打消你的疑虑

C语言是一种广泛应用于计算机编程的高级编程语言&#xff0c;自从其首次问世以来&#xff0c;就在软件开发领域取得了广泛的应用和成功。作为一种强大的编程语言&#xff0c;C语言不断发展和改进&#xff0c;也在不断地适应新的技术和需求。在未来几年&#xff0c;C语言将继续保…

移植案例与原理 - HDF驱动框架-驱动配置(1)

HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码&#xff0c;内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦&#xff0c;便于开发者进行配置管理。应该&#xff0c;类似Linux DTS(Device Tree Source)设备树。 HC-GEN(HDF Configuration Generator)是…

网络中数据链路层详解

数据链路层其实我们这里了解即可&#xff0c;因为做交换机开发的是主要学习这方面的知识。 这里我们主要了解以太网协议。 以太网是物理学的概念。以太网横跨数据链路层和物理层&#xff0c;平时咱们使用有线网就是以太网络。 如图以太网协议的报文格式&#xff1a; 上述的目…

python 微信群发工具

效果如下 python 微信消息群发工具 1、环境安装依据python手机app自动化测试环境搭建-CSDN博客 2、元素获取 启动uiautomatorviewer.bat工具,如下图 点击获取手机界面,如下图 3、根据获取的界面元素id或class名称编写代码 python简易代码如下 from appium import webdrive…

LangChain入门学习笔记(五)—— Model I/O之Chat Models

在LangChain的组件当中&#xff0c;Chat Models可以说跟LLMs占据着相同的“生态位”&#xff0c;它也是根据用户输入的提示内容&#xff0c;调用底层的大模型产生内容。与LLMs不同的是&#xff0c;LangChain的Chat Models主要有如下一些不同&#xff1a; 输入输出格式不同&…

aminer挖矿木马活动分析

1. aminer挖矿木马概览 近期&#xff0c;安天CERT通过捕风蜜罐系统[1]捕获了一批活跃的挖矿木马样本&#xff0c;该挖矿木马主要利用SSH和Redis弱口令暴力破解对Linux平台进行攻击。由于其初始脚本中下载挖矿文件的名称为“aminer.gz”&#xff0c;因此安天CERT将该挖矿木马命…

leetcode刷题(46-50)

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可以啦…

Vue发送http请求

1.创建项目 创建一个新的 Vue 2 项目非常简单。在终端中&#xff0c;进入您希望创建项目的目录(我的目录是D:\vue)&#xff0c;并运行以下命令&#xff1a; vue create vue_test 2.切换到项目目录&#xff0c;运行项目 运行成功后&#xff0c;你将会看到以下的编译成功的提示…

Oracle中递归查询(START WITH……CONNECT BY……)

一、基本语法 在Oracle中START WITH……CONNECT BY……一般用来查找存在父子关系的数据&#xff0c;也就是树形结构的数据。 SELECT * FROM TABLE WHERE 条件3 START WITH 条件1 CONNECT BY 条件2;start with [condition]&#xff1a;设置起点&#xff0c;用来限制第一层的数…

一文详解去噪扩散概率模型(DDPM)

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

AI 克隆声音,只需 3 分钟(附最全教程)

作者&#xff1a;寒斜 继生成式文本大模型 Chatgpt&#xff0c;生成式图片 Stablediffusion 之后生成式语音 Text To Speech 在开源社区也出现了一匹黑马&#xff0c;就是 GPT-Sovits [ 1] 。 之所以说他是黑马&#xff0c;让人觉得惊艳&#xff0c;是因为在语音效果克隆上做…

Deformable-DETR

DETR表现出来的问题 训练周期很长&#xff0c;相比标准的one-stage/two-stage detection在COCO上 12 epochs就能出好的结果&#xff0c;DETR标配200 epochs.对小目标不友好 作者指出&#xff0c;DETR中Transformer的问题是&#xff0c;在初始化的时候&#xff0c;网络几乎是把…

浸没式液冷服务器的换热效率及节能潜力分析

服务器浸没式液冷的换热效率及节能潜力 摘要&#xff1a;我们针对服务器浸没式液冷实验台进行了深入测试&#xff0c;探究了不同室外温度和服务器发热功率对系统制冷PUE的影响。实验数据显示&#xff0c;该系统的制冷PUE值介于1.05至1.28之间&#xff0c;高效节能特点显著。 在…

在哪可以查到全网的司法诉讼信息?

司法涉诉信息指的是再司法活动中形成的各种记录和资料&#xff0c;涵盖了诉讼案件的立案&#xff0c;审判&#xff0c;执行等各个环节的记录和文件。比如基本案件信息&#xff0c;开庭信息&#xff0c;审判信息&#xff0c;执行信息等。有时候还会涉及到被执行人&#xff0c;司…

创建进程的常用方式

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中有多个模块可以创建进程&#xff0c;比较常用的有os.fork()函数、multiprocessing模块和Pool进程池。由于os.fork()函数只适用于Unix/Linu…

常见的创建型设计模式( 一 )

设计模式( 一 ) 常见的创建型设计模式 1.单例模式 : 确保一个类只有一个实例 , 为整个程序提供一个全局的访问接口。getInstance 实现方式 饿汉式&#xff0c;在调用getInstance 创建实例的时候 &#xff0c;实例已经存在了 &#xff0c;不需要我们再次去 new创建。 优点&a…

Pytorch编写Transformer

本文参考自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 在学习了图解Transformer以后&#xff0c;需要用Pytorch编写Transformer&#xff0c;下面是写代码的过程中的总结&#xff0c;结构根据图解Transformer进行说明。 import numpy as …

stable diffusion 局部重绘 reference-only api 接口调试

webUI api payload 插件生成的接口参数不准确&#xff0c;reference-only 的image不是对象&#xff0c;就是不同字符串字段&#xff0c;直接传&#xff0c;不是套image。 综上&#xff0c;那个插件参数不确定&#xff0c;应直接看插件的源码&#xff0c;看它接受什么参数 错误…

校园车辆管理系统的设计与实现

第1章 绪论 1.1 研究背景与意义 随着高等教育的普及和扩张&#xff0c;大学校园已成为一个综合性的小型社会。教学楼、实验室、宿舍、体育设施等构成了庞大且复杂的校园基础设施。在这样的环境下&#xff0c;教师、学生、家长及访客的车辆数量也随之增多&#xff0c;这不仅带来…