Mux 原始碼閱讀

2021-10-10 18:26:09 字數 1885 閱讀 3712

結語在使用 golang 編寫 web 伺服器程式時,需要用到 mux(路由),對瀏覽器請求的 url 進行路由,根據不同的 url,使用不同的 handlerfunc 進行處理。

這裡我們可以使用 net/http 包自帶的 servemux,也可以使用第三方開源軟體包 gorilla/mux 提供的 mux。

那麼,本文將分析兩者有何不同,以及 mux 的原理是怎樣的。

以下比較過程將預設以 net/http/servemux 在前,gorilla/mux 在後的順序進行展示。

))可以看到,兩個 mux 的使用差不多,都是先建立乙個 mux 物件,然後給 mux 新增 handler。

無論是哪個 mux,主要結構都包括:mux struct,handle | handlefunc,handler | handlerfunc三個部分。

對比了兩個 mux 的源**,我知道了 gorilla 的取名原因

首先 net/http 的路由器只有一層,那就是乙個根 servemux,然後包含乙個 servemux 的陣列,所有註冊的路由全部放在這個陣列裡。

gorilla 採用路由樹的形式組織路由器,根路由(router)為 「/」,之後每次註冊路由都在根路由下建立一條路徑(或重用),比如:建立乙個 「/user/info/name」 的路由,gorilla 首先在 「/」 路由器下建立並新增乙個 match 「user」 的路由器,然後在 「user」 路由器下建立並新增乙個 match 「info「 的路由器,依次類推。

在對 url 進行解析時,gorilla 使用walk 函式,進行深度遍歷,像大猩猩一樣逐漸向下爬樹,最終找到符合整個 url 的 「葉子路由器」,並返回該路由器內部的 handler。

通過閱讀 mux 原始碼,我了解之前不太熟悉的函式,如:net/http 內建的 stripprefix 函式,可以將 url 的字首部分剝除後,返回乙個 handler。

這個函式我在做 web 伺服器時是在部落格上找到的,有時也會奇怪這些前輩是如何知道這些實用的函式的,現在看來,想必也是閱讀了原始碼或者標準庫文件,並且對自己的需求進行分析,最終得到解決方案的。

個人總結,如有差錯,敬請指正。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...