国产九九视频一区二区三区_亚洲欧美资源在线_精品国产自在久精品国产_成人午夜黄色影院

270件佳作榮膺“天工杯” 第八屆江西省“天工杯”工業(yè)設(shè)計(jì)大賽頒獎(jiǎng)儀式在九江舉行​美團(tuán)開(kāi)源虛擬人視頻生成模型 LongCat-Video-Avatar贛州南康區(qū)將工業(yè)設(shè)計(jì)深度植入制造業(yè)內(nèi)核景德鎮(zhèn)以設(shè)計(jì)重塑千年瓷都產(chǎn)業(yè)基因逐際動(dòng)力 TRON 2 具身機(jī)器人發(fā)布:可變化三種形態(tài),4.98 萬(wàn)起九江探索“設(shè)計(jì)驅(qū)動(dòng)、智造未來(lái)”特色發(fā)展路徑江西工業(yè)設(shè)計(jì)產(chǎn)業(yè)發(fā)展座談會(huì)暨協(xié)會(huì)學(xué)會(huì)會(huì)員大會(huì)在九江舉行消息稱小紅書(shū)社區(qū)架構(gòu)再調(diào)整,進(jìn)行“產(chǎn)運(yùn)研一體化融合”樂(lè)道L60紫羅蘭限定版發(fā)布,下定享現(xiàn)車(chē)交付未來(lái)穿戴赴港:不做手表,押注健康干預(yù)時(shí)代廣汽豐田全新雷凌 L 官宣,定位新一代智能 A+ 級(jí)轎車(chē)螞蟻想要一個(gè)AI超級(jí)入口,可以跟支付寶無(wú)關(guān)數(shù)智融合,智造未來(lái)——“AIR+制造”論壇成功舉辦行業(yè)都造平嵌冰箱,卡薩帝卻造風(fēng)口獨(dú)獲大獎(jiǎng)廣汽開(kāi)啟自主品牌 BU 改革,昊鉑埃安渠道融合運(yùn)營(yíng)嵐圖汽車(chē)和寧德時(shí)代簽署十年深化合作協(xié)議,優(yōu)先搭載更領(lǐng)先的電池技術(shù)全球腕戴設(shè)備最新出貨量出爐 華為第一 小米增長(zhǎng)最快首款2nm手機(jī)芯片!三星Exynos 2600確認(rèn)10核心、3.9Ghz超大核阿迪達(dá)斯「先鋒運(yùn)動(dòng)」SS26系列發(fā)布:步入幻岳之境,開(kāi)啟先鋒戶外新版圖路虎攬勝既視感 小鵬全尺寸SUV非官效果圖出爐:一眼高級(jí)
  • 首頁(yè) > 網(wǎng)絡(luò)通信頻道 > 通信技術(shù)

    提升Go的HTTP路由器的提案

    2023年08月18日 16:57:27 來(lái)源:51CTO

      譯者 | 劉汪洋

      Go 的標(biāo)準(zhǔn)庫(kù)中包含一個(gè)穩(wěn)定且成熟的 HTTP 服務(wù)器。然而,內(nèi)置的請(qǐng)求路由器http.ServeMux 功能較為簡(jiǎn)潔,因此你常常需要自己編寫(xiě)路由代碼。

      其主要短板是,它并未支持 HTTP 方法的匹配(如GET和POST的區(qū)別),同時(shí)也無(wú)法持/users/{user}/settings這種類(lèi)型的通配符路徑。然而,這兩個(gè)功能幾乎是所有 REST 風(fēng)格的 API 服務(wù)器所必需的。

      當(dāng)然,你可以選擇自行實(shí)現(xiàn)這些功能。在我以前的一篇文章 Go 中不同的 HTTP 路由方法中,提到過(guò)有一些優(yōu)秀的第三方包可以實(shí)現(xiàn)更高級(jí)的路由功能,并且只需 約 30 行代碼 就能夠在不借助任何第三方庫(kù)的情況下實(shí)現(xiàn)類(lèi)似的功能。

      但是,未來(lái)可能不再需要這些替代方案和第三方包。現(xiàn)在有一個(gè) 活躍的提案 - 還包括一個(gè)旨在改進(jìn) ServeMux 參考實(shí)現(xiàn) ,使其能夠匹配 HTTP 方法和通配符路徑。

      Google 的 Go 團(tuán)隊(duì)成員 Jonathan Amsterdam 主導(dǎo)了這個(gè)提案以及之前的 討論。Jonathan 曾成功提出將結(jié)構(gòu)化日志添加到標(biāo)準(zhǔn)庫(kù)的提案 - Go 1.21 將包含他的log/slog包(預(yù)計(jì) 2023 年 8 月發(fā)布)。

      現(xiàn)狀與變革

      在目前的情況下,如果想將 GET 請(qǐng)求匹配到 /users/{user}/settings,你需要編寫(xiě)以下的樣板代碼(盡管在實(shí)踐中你可能會(huì)使用第三方庫(kù)):

      復(fù)制

      mux.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {

      if r.Method != "GET" {

      http.Error(w, "method not allowed", http.StatusMethodNotAllowed)

      return

      }

      remainder := r.URL.Path[len("/users/"):]

      userId, subPath, _ := strings.Cut(remainder, "/")

      switch subPath {

      case "settings":

      fmt.Fprintf(w, "user %s", userId)

      // 其他子路徑可以在這里添加

      default:

      http.NotFound(w, r)

      }

      })

      如果接受了這個(gè)提議,你可以更加簡(jiǎn)單地實(shí)現(xiàn)一樣的功能:

      復(fù)制

      mux.HandleFunc("GET /users/{user}/settings", func(w http.ResponseWriter, r *http.Request) {

      fmt.Fprintf(w, "user %s", r.PathValue("user"))

      })

      這樣的寫(xiě)法明顯更為簡(jiǎn)潔!

      這與其他流行路由器使用的語(yǔ)法非常相似:

      復(fù)制

      // github.com/go-chi/chi

      router.Get("/users/{user}/settings", func(w http.ResponseWriter, r *http.Request) {

      fmt.Fprintf(w, "user %s", chi.URLParam(r, "slug"))

      })

      // github.com/gorilla/mux

      router.HandleFunc("/users/{user}/settings", func(w http.ResponseWriter, r *http.Request) {

      fmt.Fprintf(w, "user %s", mux.Vars(r)["user"])

      }).Methods("GET")

      // github.com/bmizerany/pat

      router.Get("/users/:user/settings", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

      fmt.Fprintf(w, "user %s", r.URL.Query().Get(":user"))

      }))

      // github.com/gin-gonic/gin

      router.GET("/users/:user/settings", func(c *gin.Context) {

      fmt.Fprintf(w, "user %s", c.Param("user"))

      })

      提案中的一個(gè)有趣決定是,并沒(méi)有為 ServeMux 添加新的方法;而是對(duì)現(xiàn)有的 Handle 和 HandleFunc 方法進(jìn)行了擴(kuò)展,以支持方法前綴和 {wildcard} 路徑段。

      我理解他們避免添加新方法的想法,但我對(duì)這個(gè)決定持保留態(tài)度。遺憾的是,舊版的 ServeMux 接受如 Handle("GET /foo", h) 的模式。這意味著為增強(qiáng)版 ServeMux 編寫(xiě)的代碼將在舊版 Go 上能正常編譯和運(yùn)行,但路由不會(huì)匹配到任何內(nèi)容,這容易導(dǎo)致錯(cuò)誤。我可能會(huì)添加新的方法,比如 HandleMatch / HandleMatchFunc 或 Route / RouteFunc。

      該提議也詳細(xì)描述了處理兩個(gè)重疊模式的優(yōu)先級(jí),其核心規(guī)則簡(jiǎn)單明了:“如果兩個(gè)模式有重疊(有共同的請(qǐng)求),則更具體的模式優(yōu)先匹配”。

      例如,如果你注冊(cè)了模式 /users/(匹配 /users/*)以及模式 /users/{user},當(dāng)一個(gè) /users/ben 的請(qǐng)求進(jìn)來(lái)時(shí),它將匹配第二個(gè),更具體的模式。這與現(xiàn)有的 ServeMux 中,特定主機(jī)的模式優(yōu)先于沒(méi)有主機(jī)名的模式的行為一致。

      URL 末尾通配符匹配

      此提案為我們帶來(lái)了一個(gè)新的"特殊通配符" {$},它專(zhuān)門(mén)用于匹配 URL 的末尾。對(duì)于那些僅希望匹配主頁(yè)路由的情況,這個(gè)新特性顯得非常實(shí)用。在此之前,要實(shí)現(xiàn)這一目標(biāo)頗為麻煩,因?yàn)橐?/ 結(jié)尾的模式會(huì)匹配所有 / 之下的內(nèi)容;這個(gè)規(guī)則對(duì)于只有 / 的模式同樣適用。

      因此,以前若想匹配主頁(yè),你需要這樣操作:

      復(fù)制

      mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

      if r.URL.Path != "/" { // 確保路徑就是 "/"

      http.NotFound(w, r)

      return

      }

      serveHomepage(w, r)

      })

      mux.HandleFunc("/users", serveUsers)

      這一過(guò)程頗為繁瑣。若你忘記了路徑檢查,那么你最終可能會(huì)將主頁(yè)用于所有其他的 URL,而不是顯示一個(gè)未找到的頁(yè)面,因?yàn)樗械膬?nèi)容都在 / 之下。

      而根據(jù)新的提案,這個(gè)過(guò)程將變得更加簡(jiǎn)潔:

      復(fù)制

      mux.HandleFunc("/{$}", serveHomepage)

      mux.HandleFunc("/users", serveUsers)

      實(shí)現(xiàn)參考

      Jonathan 在 github.com/jba/muxpatterns 中發(fā)布了一個(gè) ServeMux 的增強(qiáng)版本的示例實(shí)現(xiàn)。唯一的區(qū)別在于,由于它是在單獨(dú)的包中,無(wú)法改變 http.Request 類(lèi)型, 所以你需要用 mux.PathValue(request, "name") 來(lái)獲取路徑值,而非 request.PathValue("name")。

      我在 我的 go-routing 倉(cāng)庫(kù) 中添加了一個(gè) PR,這個(gè) PR 提供了我自己的 widget API 的一種實(shí)現(xiàn),使用 muxpatterns。這個(gè)版本與 chi 版本 非常相似 —— 清晰且易讀:

      復(fù)制

      r.HandleFunc("GET /{$}", home)

      r.HandleFunc("GET /contact", contact)

      r.HandleFunc("GET /api/widgets", apiGetWidgets)

      r.HandleFunc("POST /api/widgets", apiCreateWidget)

      r.HandleFunc("POST /api/widgets/{slug}", apiUpdateWidget)

      r.HandleFunc("POST /api/widgets/{slug}/parts", apiCreateWidgetPart)

      r.HandleFunc("POST /api/widgets/{slug}/parts/{id}/update", apiUpdateWidgetPart)

      r.HandleFunc("POST /api/widgets/{slug}/parts/{id}/delete", apiDeleteWidgetPart)

      r.HandleFunc("GET /{slug}", widgetGet)

      r.HandleFunc("GET /{slug}/admin", widgetAdmin)

      r.HandleFunc("POST /{slug}/image", widgetImage)

      當(dāng)我首次測(cè)試這個(gè)參考實(shí)現(xiàn)時(shí),我發(fā)現(xiàn)了一些小問(wèn)題,現(xiàn)已得到修復(fù)。

      結(jié)論

      盡管我對(duì)于擴(kuò)展現(xiàn)有的 Handle 和 HandleFunc 方法有一些保留,但我對(duì)這個(gè)提案的考慮感到欣慰。鑒于 Jonathan 在提案中的謹(jǐn)慎處理、他在 log/slog 上的良好表現(xiàn)以及社區(qū)的積極反饋,此提案被接受的可能性很高。

      如果這個(gè)功能能進(jìn)入標(biāo)準(zhǔn)庫(kù),那將非常棒 —— 我開(kāi)發(fā)的幾乎所有網(wǎng)站和 REST 風(fēng)格的 API 都將用到這個(gè)功能。Go 的標(biāo)準(zhǔn)庫(kù)已經(jīng)非常強(qiáng)大,但加入這個(gè)功能將進(jìn)一步減少對(duì)第三方路由器的依賴。

      如果這個(gè)功能能夠集成在 2024 年 2 月發(fā)布的 Go 1.22 中,我并不會(huì)感到驚訝。讓我們拭目以待!

      譯者介紹

      劉汪洋,51CTO社區(qū)編輯,昵稱:明明如月,一個(gè)擁有 5 年開(kāi)發(fā)經(jīng)驗(yàn)的某大廠高級(jí) Java 工程師,擁有多個(gè)主流技術(shù)博客平臺(tái)博客專(zhuān)家稱號(hào)。

      文章內(nèi)容僅供閱讀,不構(gòu)成投資建議,請(qǐng)謹(jǐn)慎對(duì)待。投資者據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。

    海報(bào)生成中...

    最新新聞

    熱門(mén)新聞

    即時(shí)

    全球頂級(jí)AI創(chuàng)作社區(qū)回歸!海藝AI國(guó)內(nèi)首發(fā)“全民娛樂(lè)化創(chuàng)作

    海藝AI的模型系統(tǒng)在國(guó)際市場(chǎng)上廣受好評(píng),目前站內(nèi)累計(jì)模型數(shù)超過(guò)80萬(wàn)個(gè),涵蓋寫(xiě)實(shí)、二次元、插畫(huà)、設(shè)計(jì)、攝影、風(fēng)格化圖像等多類(lèi)型應(yīng)用場(chǎng)景,基本覆蓋所有主流創(chuàng)作風(fēng)格。

    新聞

    市場(chǎng)占比高達(dá)35.8%,阿里云引領(lǐng)中國(guó)AI云增長(zhǎng)

    9月9日,國(guó)際權(quán)威市場(chǎng)調(diào)研機(jī)構(gòu)英富曼(Omdia)發(fā)布了《中國(guó)AI云市場(chǎng),1H25》報(bào)告。中國(guó)AI云市場(chǎng)阿里云占比8%位列第一。

    企業(yè)IT

    華為坤靈發(fā)布IdeaHub千行百業(yè)體驗(yàn)官計(jì)劃,助力中小企

    9月24日,華為坤靈召開(kāi)“智能體驗(yàn),一屏到位”華為IdeaHub千行百業(yè)體驗(yàn)官計(jì)劃發(fā)布會(huì)。

    3C消費(fèi)

    雅馬哈推出兩款高端頭戴耳機(jī)YH-4000與YH-C3000

    雅馬哈昨日宣布推出兩款頭戴式耳機(jī),分別是平板振膜的YH-4000和動(dòng)圈原理的YH-C3000。

    研究

    IDC:2025上半年全球智能家居清潔機(jī)器人出貨量同比暴

    IDC今日發(fā)布的《全球智能家居清潔機(jī)器人設(shè)備市場(chǎng)季度跟蹤報(bào)告,2025年第二季度》顯示,上半年全球智能家居清潔機(jī)器人市場(chǎng)出貨1,2萬(wàn)臺(tái),同比增長(zhǎng)33%,顯示出品類(lèi)強(qiáng)勁的市場(chǎng)需求。

    国产九九视频一区二区三区_亚洲欧美资源在线_精品国产自在久精品国产_成人午夜黄色影院
    | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |