<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【GoCN酷Go推薦】Go Web 路由處理利器 gorilla/mux 庫

          共 4908字,需瀏覽 10分鐘

           ·

          2021-05-24 16:15

          gorilla/mux 簡介

          gorilla/mux 是用來處理路由請求和請求對應(yīng)的方法的映射關(guān)系的包,簡單地說,gorilla/mux 就是把收到的請求與一組預(yù)先定義的 URL 路徑列表做對比,然后在匹配到路徑的時(shí)候調(diào)用關(guān)聯(lián)的處理器(Handler)。

          為什么那么受歡迎?


          gorilla/mux  在標(biāo)準(zhǔn)庫 net/http 之上開發(fā)的,因此 gorilla/mux 比較能干,標(biāo)準(zhǔn)能干的也能干,不能干的也能干;標(biāo)準(zhǔn)庫在運(yùn)行效率上占優(yōu),gorilla/mux 在開發(fā)效率上占優(yōu);,gorilla/mux 是目前功能最為強(qiáng)大的路由包之一,它提供功能全面而強(qiáng)大,這也是它連續(xù)多年成為使用率最高的 Go 第三方包的原因。

          什么時(shí)候用到它?

          gorilla/mux 的路由解析所采用的是精準(zhǔn)匹配規(guī)則,標(biāo)準(zhǔn)庫 net/http 采用的是長度優(yōu)先匹配規(guī)則,精準(zhǔn)匹配是只會(huì)匹配準(zhǔn)確指定的路由,而長度優(yōu)先匹配不支持動(dòng)態(tài)元素,也就是不支持正則以及 URL 路徑參數(shù),只能匹配字符數(shù)較多的路由;開發(fā) Web,API 時(shí)路由一般時(shí)動(dòng)態(tài)的,路由參數(shù)會(huì)跟著訪問對象不同而不同,這是 gorilla/mux 恰好滿足了這種精準(zhǔn)路由匹配需求。

          在知名的路由包中 gorilla/mux 的功能比較強(qiáng)大,使用相對簡單且很實(shí),歷史也非常悠久,可以放心去使用。

          怎么使用?


          使用前要安裝它,安裝要在當(dāng)前項(xiàng)目所在目錄中執(zhí)行 go get -u github.com/gorilla/mux 即可。

          安裝完寫一個(gè) Web 應(yīng)用示例:

          package main

          import (
           "fmt"
           "net/http"

           "github.com/gorilla/mux"
          )

          func homeHandler(w http.ResponseWriter, r *http.Request) {
           fmt.Fprint(w, "<h1>This is homePage!</h1>")
          }

          func articlesIndexHandler(w http.ResponseWriter, r *http.Request) {
           fmt.Fprint(w, "<h1>This is articlesIndexPage!</h1>")
          }

          func notFoundHandler(w http.ResponseWriter, r *http.Request) {
           fmt.Fprint(w, "<h1>This is notFoundPage</h1>")
          }

          func articlesShowHandler(w http.ResponseWriter, r *http.Request) {
           //mux 提供 mux.Vars(r) 的方法會(huì)將 URL 路徑參數(shù)解析為 Map, key 是路由參數(shù),value 是參數(shù)對應(yīng)的值,
           vars := mux.Vars(r)
           id := vars["id"]
           fmt.Fprint(w, "<h1>This articles‘s ID:"+id+"</h1>")
          }

          func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {
           //獲取表單中傳輸?shù)臄?shù)據(jù)方式有 r.ParseForm, ParseFormValue 等,具體如下:
           //r.ParseForm() 是由標(biāo)準(zhǔn)庫 http 包提供的,從請求中解析請求參數(shù),必須是執(zhí)行完這段代碼,
           //再用 r.PostForm 和 r.Form 來獲取到數(shù)據(jù),不事先 r.ParseForm() 來解析時(shí)獲取不到數(shù)據(jù)。
           err := r.ParseForm()
           if err != nil {
            fmt.Fprint(w, "請?jiān)诒韱沃刑顚憯?shù)據(jù)再提交!")
            return
           }

           title := r.PostForm.Get("title")
           content := r.PostForm.Get("content")
           author := r.PostForm.Get("author")
           fmt.Fprintf(w, "title 的值為: %v", title)
           fmt.Fprintf(w, "content 的值為: %v", content)
           fmt.Fprintf(w, "author 的值為: %v", author)

           //PostForm 只能能讀取 post、put 方式傳輸?shù)膮?shù),在使用之前需要調(diào)用 ParseForm 方法。
           fmt.Fprintf(w, "POST PostForm: %v <br>", r.PostForm)
           //Form 能讀取 post、put 和 get 方式傳輸?shù)膮?shù),在使用之前必須調(diào)用 ParseForm 方法來解析路由
           fmt.Fprintf(w, "POST Form: %v <br>", r.Form)
           //  直接獲取想要的參數(shù),則直接使用 r.PostFormValue() 方法即可,無需調(diào)用 ParseForm 方法來解析路由
           fmt.Fprintf(w, "r.Form() 中 title 的值為: %v <br>", r.FormValue("title"))
           fmt.Fprintf(w, "r.PostForm() 中 title 的值為: %v <br>", r.PostFormValue("title"))
          }


          func main() {
           //注冊路由
           router := mux.NewRouter()

           //精準(zhǔn)匹配的
           router.HandleFunc("/", homeHandler).Methods("GET").Name("home")
           router.HandleFunc("/articles/{id:[0-9]+}", articlesShowHandler).Methods("GET").Name("articles.show")
           router.HandleFunc("/articles", articlesIndexHandler).Methods("GET").Name("articles.index")
           router.HandleFunc("/articles/{id:[0-9]+}", articlesStoreHandler).Methods("GET").Name("articles.store")

           //未匹配到路由時(shí)匹配到 notFoundHandler
           router.NotFoundHandler = http.HandlerFunc(notFoundHandler)

           //監(jiān)聽路由
           http.ListenAndServe(":6060", router)
          }

          寫完示例,執(zhí)行 go run main.go 啟動(dòng) Web 服務(wù);再用 Postman 來訪問一下 url 即可看到返回結(jié)果。

          • GET 方式訪問 localhost:6060/
          • GET 方式訪問 localhost:6060/articls
          • GET 方式訪問 localhost:6060/articles/2
          • POST 方式訪問 localhost:6060/articles

          以上的所以路由中用到了路由別名 router.HandleFunc(_, _).Methods("GET")..Name("別名")' ,除此之外在articlesIndexHandler).Methods("GET").Name("articles.index") router.HandleFunc("/articles/{id:[0-9]+}", ` 中用到了動(dòng)態(tài)路由,也就是 id 不一樣展示的對象也不一樣。

          除了提供 Web 開發(fā)常用功能之外,gorilla/mux 包還提供其他一些功能,比如,域名綁定,路由分組,路由綁定前綴,路由中間件等,看具體業(yè)務(wù)需求選擇性使用即可。


          總結(jié)


          gorilla/mux 庫是歷史悠久,從使用文檔齊全、其質(zhì)量和社區(qū)活躍度都很 nice,多年 Go 趨勢報(bào)告中指出 gorilla/mux 是整個(gè)社區(qū)使用率最高的第三方庫,占據(jù) 36% 的市場份額。

          gorilla/mux 使用方式簡單,擴(kuò)展性好,功能強(qiáng)大且全面,也可以根據(jù)自身業(yè)務(wù)需要對它進(jìn)行定制化的二次開發(fā)。

          gorilla/mux 能大大提升 Web 應(yīng)用開發(fā)效率,使用簡單不粗暴。


          參考資料



          還想了解更多嗎?

          更多請查看:https://github.com/gorilla/mux

          歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/


          《酷Go推薦》招募:


          各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到

          新的庫,并且知道怎么用。


          大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名?。▓?bào)名地址:https://wj.qq.com/s2/7734329/3f51)


          掃碼也可以加入 GoCN 的大家族喲~


           Gopher China2021大會(huì)日程詳情來了!



          瀏覽 68
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆1级| 大鸡巴在线视频观看 | 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲啪啪视频 | 黄色操逼的免费网站 男女操逼的视频免费网站 |