天天看點

gin的源碼解讀4-gin的路由算法

gin的是路由算法其實就是一個Trie樹(也就是字首樹). 有關資料結構的可以自己去網上找相關資料檢視.

我們在使用gin時通過下面的代碼注冊路由

<code>router.Use(gin.Recovery())</code>

在調用POST, GET, HEAD等路由HTTP相關函數時, 會調用handle函數

如果調用了中間件的話, 會調用下面函數

如果使用了Group的話, 會調用下面函數

重點關注下面兩個函數:

綜合來看, 在預處理階段

1.在調用中間件的時候, 是将某個路由的handler處理函數和中間件的處理函數都放在了Handlers的數組中 2.在調用Group的時候, 是将路由的path上面拼上Group的值. 也就是/user/:name, 會變成v1/user:name

調用group.engine.addRoute(httpMethod, absolutePath, handlers)将預處理階段的結果注冊到gin Engine的trees上

gin的路由樹算法是一棵字首樹. 不過并不是隻有一顆樹, 而是每種方法(POST, GET ...)都有自己的一顆樹

gin 路由最終的樣子大概是下面的樣子

其實gin的實作不像一個真正的樹, children []*node所有的孩子都放在這個數組裡面, 利用indices, priority變相實作一棵樹

當服務端收到用戶端的請求時, 根據path去trees比對到相關的路由, 拿到相關的處理handlers

主要在下面這個函數裡面調用程式注冊的路由處理函數

參考連結