什么是gin框架
gin框架是一個用于構建 Web 應用程序的 Go 語言框架热凹。它旨在提供一種簡單,快速的方式來構建 Web 應用程序油航。Gin 使用了一種名為底層感知(low-level awareness)的技術但荤,可以最大化應用程序的性能。Gin 還具有豐富的中間件(middleware)庫确买,可以方便地擴展應用程序的功能。
git地址
https://github.com/gin
如何使用gin框架
如何在項目中使用該命令:go get -u github.com/gin-gonic/gin
如果下載超時 可以使用代理解決 查看上一篇文章http://www.reibang.com/p/b6cdab0b852f
代碼
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
//1.創(chuàng)建 engine對象
engine := gin.Default()
engine.Use(middleware)
//2.設置請求路徑
engine.GET("/hello", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{"data":"hello"})
})
//3. 設置端口啟動
if err := engine.Run(":8081"); err != nil {
recover()
}
}
通過上述代碼片段服務已經可以使用纱皆,可以訪問http:127.0.0.1:8088/hello
即可獲得服務端返回的數據湾趾。
原理解讀
注冊engine
我們從上述代碼中可以看出使用gin.Default()
方法創(chuàng)建engine對象,大致原理為:
func Default() *Engine {
//...
engine := New()
//...
return engine
}
我們可以看出來Default方法中使用New()方法創(chuàng)建engine對象派草,具體的詳情如下展示:
func New() *Engine {
// ...
//創(chuàng)建engine 實例
engine := &Engine{
RouterGroup: RouterGroup{
Handlers: nil,
basePath: "/",
root: true,
},
// ...
// 9 棵路由壓縮樹搀缠,對應9種http方法
trees: make(methodTrees, 0, 9),
// ...
}
engine.RouterGroup.engine = engine
// engine.Context 對象池
engine.pool.New = func() any {
return engine.allocateContext(engine.maxParams)
}
return engine
}
我們大概可以看出,在創(chuàng)建engine實例近迁,中可以看到有9種壓縮樹對應的http的9種請求方式艺普。
注冊middleware
通過engine.Use()
方法可以實現中間件的注冊,會將注冊的middleware添加RouterGroup.handles中鉴竭。后續(xù)RouterGroup下注冊的handle都會在前綴中拼上這部分group公共的handles歧譬。
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
engine.RouterGroup.Use(middleware...)
//...
return engine
}
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
group.Handlers = append(group.Handlers, middleware...)
return group.returnObj()
}
handler注冊流程
我們以http Get請求為例子handler的注冊流程為先調用handle方法,然后通過3步驟:第一步主要判斷注冊的路徑屬于哪個路由組搏存,路由組下有部分的公共的參數被該路由組所公用瑰步,在該路由組下選擇對應的basepath,作為公共的前綴,根據公共淺醉拼接上自身的路徑可以得到一個完整的路徑璧眠。第二步主要是將注冊的handles鏈時缩焦,先獲取到routeGroup組中公用的中間件獲取到兵钮,拼接到注冊的handles, 形成一個完整的handles鏈舌界。第三步,會選擇對應的壓縮前綴樹檢索泰演,如果有節(jié)點就復用呻拌,如果沒有就創(chuàng)建。
前綴樹
Trie樹睦焕,即字典樹藐握,又稱單詞查找樹或鍵樹,是一種樹形結構垃喊,是一種哈希樹的變種猾普。
典型應用是用于統(tǒng)計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計本谜。
它的優(yōu)點是:利用字符串的公共前綴來減少查詢時間初家,最大限度地減少無謂的字符串比較。
如圖2所示該圖就是一個前綴樹乌助。
壓縮前綴樹
壓縮前綴樹是在前綴樹的基礎上多了一個條件某個子節(jié)點是其父節(jié)點的唯一孩子溜在,則與父節(jié)點進行合并
如圖3所示,我們在樹種插入ABC他托,ABCD掖肋,BCD,壓縮樹在進行壓縮的時候首先根據我們上面將的規(guī)則進行壓縮赏参,某個子節(jié)點是其父節(jié)點的唯一孩子志笼,則與父節(jié)點進行合并
可以看到壓縮后將 BCD進行了壓縮,有人會問為什么不能將CD進行壓縮把篓,因為如果將CD壓縮為一個節(jié)點纫溃,那么ABC就失效了。
gin框架也采用了壓縮前綴樹的數據結構
采用壓縮前綴樹相對于map結構是有幾點優(yōu)勢的:
第一:壓縮前綴樹更容易處理處理通配韧掩,例如:/ping/,/user/*皇耗,
第二:壓縮前綴樹相對于map更加的節(jié)省空間
第三:map檢索和數量量有關系,前綴樹和數據長度有關
通過這3點可以看出壓縮前綴樹在該場景下更加有優(yōu)勢揍很。
gin框架還對壓縮前綴樹做了策略調整郎楼,將鏈路相對較長的鏈路放到樹的最左邊,方便檢索窒悔。