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 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{}
### Golang Gin 框架使用教程 #### 安装环境准备 为了能够顺利安装和使用Gin框架,需先确保已正确安装Golang。对于Golang的版本建议不低于1.15[^3]。 #### 安装Gin框架 通过`go get`命令来获取Gin库文件,这会自动将所需的依赖项一同下载下来: ```bash $ go get -u github.com/gin-gonic/gin ``` 如果遇到网络问题无法正常拉取资源,则可以通过配置GOPROXY指向国内镜像源解决此问题: ```bash $ go env -w GO111MODULE=on $ go env -w GOPROXY=https://goproxy.cn,direct ``` 以上操作完成后即完成了Gin框架的基础安装过程[^2]。 #### 创建第一个HTTP服务器实例 下面给出一段简单的代码用来创建基于Gin框架的Web服务端程序: ```go package main import ( "net/http" "github.com/gin-gonic/gin" ) func helloWorld(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello world!", }) } func main() { r := gin.Default() r.GET("/hello", helloWorld) r.Run(":8080") // 默认监听地址为localhost:8080 } ``` 这段代码定义了一个GET类型的API接口/hello,在接收到客户端请求时返回JSON格式的消息"Hello world!"给调用方[^1]。 #### 集成Swagger自动生成API文档 为了让开发者更加方便地维护RESTful API的设计说明以及测试在线调试功能,可以考虑集成Swagger工具来自动生成交互式的API文档。具体做法是在项目里加入必要的模块支持,并按照官方指南完成相应设置即可实现这一目标[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值