1 回答

TA貢獻1871條經驗 獲得超8個贊
自定義處理程序結構,一個ServeMux,一個HandlerFunc和第三方路由器的所有類型http.Handler。您可以根據需要對它們進行組合和分層。
由于 ServeMux 是一個處理程序,您可以像任何其他處理程序一樣將其分配給一個路徑,并為各種處理程序注冊單獨的路徑。這是使用多個的示例http.ServeMux(如果您選擇,可以在單獨的包中定義)。這有 3 個單獨的處理程序(通過 a 定義HandlerFunc),通過 2 路由ServeMux。
這里我們在包“路由器”中創建了一個 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)
}
現在我們可以從“路由器”導入 ServeMux,并在我們的頂級處理程序中使用它,以及其他一些:
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())
}
您選擇如何注冊這些取決于您,通過像這樣在main包中導入和路由它們,或者通過一些其他注冊模式(例如database/sql驅動程序)。
也不乏 3rd 方路由包來使這更容易、更高的性能或提供更高級的模式匹配方法。
- 1 回答
- 0 關注
- 186 瀏覽
添加回答
舉報