Go ServeMux
最后修改时间 2024 年 4 月 11 日
在本文中,我们将展示如何在 Golang 中使用 ServeMux 进行请求路由和分发。
HTTP
超文本传输协议(Hypertext Transfer Protocol (HTTP))是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP 协议是万维网数据通信的基础。
ServeMux
ServeMux 是一个 HTTP 请求多路复用器。它用于请求路由和分发。请求路由基于 URL 模式。将匹配最接近 URL 的模式的处理器调用。
Go NewServeMux
NewServeMux
函数分配并返回一个新的 ServeMux。
main.go
package main import ( "log" "net/http" "time" ) func main() { mux := http.NewServeMux() now := time.Now() mux.HandleFunc("/today", func(rw http.ResponseWriter, _ *http.Request) { rw.Write([]byte(now.Format(time.ANSIC))) }) log.Println("Listening...") http.ListenAndServe(":3000", mux) }
该示例创建了一个 HTTP 服务器,它为 /today
URL 模式返回当前日期和时间。
mux := http.NewServeMux()
创建了一个新的 ServeMux。
mux.HandleFunc("/today", func(rw http.ResponseWriter, _ *http.Request) { rw.Write([]byte(now.Format(time.ANSIC))) })
使用 HandleFunc
函数将 /today
模式的句柄添加到其中。
http.ListenAndServe(":3000", mux)
创建的多路复用器被传递给 ListenAndServe
函数。
Go DefaultServeMux
DefaultServeMux
只是一个 ServeMux。当我们为 ListenAndServe
方法的第二个参数传递 nil
时,就会使用它。
http.Handle
和 http.HandleFunc
全局函数使用 DefaultServeMux
多路复用器。
main.go
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", HelloHandler) log.Println("Listening...") log.Fatal(http.ListenAndServe(":3000", nil)) } func HelloHandler(w http.ResponseWriter, _ *http.Request) { fmt.Fprintf(w, "Hello there!") }
该示例使用默认多路复用器。
自定义处理器
func (*ServeMux) Handle
函数为给定的模式注册处理器。
http.HandlerFunc
是一个适配器,它将一个具有正确签名的函数转换为 http.Handler
。
main.go
package main import ( "fmt" "log" "net/http" ) type helloHandler struct { } func (h *helloHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) { fmt.Fprintf(w, "Hello there!") } func main() { mux := http.NewServeMux() hello := &helloHandler{} mux.Handle("/hello", hello) log.Println("Listening...") http.ListenAndServe(":3000", mux) }
在示例中,我们创建了一个自定义处理器。
type helloHandler struct { }
声明了一个新类型。
func (h *helloHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) { fmt.Fprintf(w, "Hello there!") }
要成为处理器,该类型必须实现 ServeHTTP
函数。
hello := &helloHandler{} mux.Handle("/hello", hello)
我们创建了处理器并将其传递给 Handle
函数。
来源
在本文中,我们展示了如何使用 ServeMux 在 Go 中进行请求路由和分发。