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 关注
- 146 浏览
添加回答
举报