第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將一個(gè)新的 ServeMux 組合成一個(gè)更大的結(jié)構(gòu)?

如何將一個(gè)新的 ServeMux 組合成一個(gè)更大的結(jié)構(gòu)?

Go
守候你守候我 2021-11-08 14:35:19
在我以前使用 DefaultServeMux 制作的 golang 應(yīng)用程序中,如果我有一個(gè)這樣的"/users/"路由,func user(name string)例如由 處理的路由,并且我向 發(fā)送了一個(gè)請(qǐng)求/users/jim,該請(qǐng)求仍將由該"/users/"路由處理。在我正在制作的當(dāng)前應(yīng)用程序中,我沒有使用,DefaultServeMux而只是傳遞一個(gè)實(shí)現(xiàn) ServeHTTP 的處理程序,然后打開請(qǐng)求 url。但是,現(xiàn)在,如果我向不完全匹配的路由發(fā)送請(qǐng)求,則不會(huì)調(diào)用處理程序函數(shù)。例如,如果我向 發(fā)送 post 請(qǐng)求"/api/jim",即使"/api"已處理,我也會(huì)收到 404 錯(cuò)誤。我想讓我的應(yīng)用程序保持原樣(在處理程序中引用數(shù)據(jù)庫),但也能夠處理不完全匹配的路由。問題:假設(shè)我可以創(chuàng)建一個(gè)新的 ServeMux 來處理不完全匹配的路由,但是我如何將它與具有對(duì)數(shù)據(jù)庫連接的引用的類型 Handler Struct 組合起來?type Handler struct{  DB *DB}func main() {    fmt.Println("Hello, playground")    db, err := sql.Open("postgres", dbinfo)    defer db.Close()    h := &Handler{      DB: db,    }    log.Fatal(http.ListenAndServe(":8888", h))}func (h *Handler)ServeHTTP(w http.ResponseWriter, r *http.Request){    switch r.URL.Path{        case "/":        h.serveRoot(w, r)        case "/api/":        h.apiRouter(w, r)    }}func (h *Handler)serveRoot(w http.ResponseWriter, r *http.Request){        h.DB.DoSomethingWithDB()}func (h *Handler)apiRouter(w http.ResponseWriter, r *http.Request){       switch r.URL.Path{           case "/":               h.serveRoot(w, r)           case "/api/":               h.apiRouter(w, r)       }}更新 由于與問題無關(guān)的原因,我不能使用 DefaultServeMux
查看完整描述

1 回答

?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

自定義處理程序結(jié)構(gòu),一個(gè)ServeMux,一個(gè)HandlerFunc和第三方路由器的所有類型http.Handler。您可以根據(jù)需要對(duì)它們進(jìn)行組合和分層。


由于 ServeMux 是一個(gè)處理程序,您可以像任何其他處理程序一樣將其分配給一個(gè)路徑,并為各種處理程序注冊(cè)單獨(dú)的路徑。這是使用多個(gè)的示例http.ServeMux(如果您選擇,可以在單獨(dú)的包中定義)。這有 3 個(gè)單獨(dú)的處理程序(通過 a 定義HandlerFunc),通過 2 路由ServeMux。


這里我們?cè)诎奥酚善鳌敝袆?chuàng)建了一個(gè) ServeMux


var Sub = http.NewServeMux()


func subHandler(w http.ResponseWriter, r *http.Request) {

    fmt.Println("handled / in /sub")

    w.Write([]byte("/sub/\n"))

}    


func init() {

    Sub.HandleFunc("/", subHandler)

}

現(xiàn)在我們可以從“路由器”導(dǎo)入 ServeMux,并在我們的頂級(jí)處理程序中使用它,以及其他一些:


import "router"


func rootHandler(w http.ResponseWriter, r *http.Request) {

    fmt.Println("handled /")

    w.Write([]byte("/\n"))

}


func topHandler(w http.ResponseWriter, r *http.Request) {

    fmt.Println("handled /top")

    w.Write([]byte("/top/\n"))

}

func main() {


    mux := http.NewServeMux()

    mux.HandleFunc("/", rootHandler)

    mux.HandleFunc("/top/", topHandler)


    // now insert the Sub routes under "/top/sub/"

    mux.Handle("/top/sub/", http.StripPrefix("/top", router.Sub))


    server := &http.Server{Addr: ":9999", Handler: mux}

    log.Fatal(server.ListenAndServe())

}

您選擇如何注冊(cè)這些取決于您,通過像這樣在main包中導(dǎo)入和路由它們,或者通過一些其他注冊(cè)模式(例如database/sql驅(qū)動(dòng)程序)。


也不乏 3rd 方路由包來使這更容易、更高的性能或提供更高級(jí)的模式匹配方法。


查看完整回答
反對(duì) 回復(fù) 2021-11-08
  • 1 回答
  • 0 關(guān)注
  • 174 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)