ServeMux详解
创建一个http服务
在 Go 语言中,创建一个 HTTP 服务只需要写下面几行代码就可以了。
func main() {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello web"))
})
http.ListenAndServe(":9999", nil)
}
我们定义了一个路由,然后启动 HTTP 服务,就可以在浏览器中通过 localhost:9999 来访问服务,服务端会返回 Hello web。这样就创建了一个http服务。
HTTP 服务如何运行
上面的代码有两部分,一部分是定义 HTTP 服务的路由,在服务启动之后,我们访问相应的路由,就能得到服务端的响应。
在 http 包中,有一个接口 http.Handler
,这个接口是 HTTP 服务的核心:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
一个 完整的HTTP 服务,需要有发起请求的客服端和处理请求的服务端,客户端发起一个请求,然后服务端给出对应的输出。这个 Handler 接口就把这个整个过程抽象为 ServeHTTP 方法。ResponseWriter 表示服务端的输出,Request 表示来自客户端的请求。
在 http 包中提供了一个 Handler 的实现 ServeMux,这个Handler 做的事情也很简单,就是来维护 URL 和 Handler 之间的关系,根据 URL 判断应该把请求转发到哪个 Handler。
ServeMux
http.ServeMux
是 Go 标准库 net/http
中的 HTTP 请求路由器(路由复用器),负责将传入的 HTTP 请求匹配到对应的处理函数(Handler
)。它是 Go 中最基础的路由实现,常用于构建简单的 Web 服务。
核心功能
- 路由匹配:根据 URL 路径(
r.URL.Path
)将请求分发给注册的Handler
。路由由两部分组成,一个是匹配 HTTP url 的 pattern,每个pattern 都代表着一类 HTTP 请求,都需要一个对应的 handler 来处理。 - 路径标准化:自动处理路径末尾的
/
和重复斜杠(如/api//v1
→/api/v1
)。 - 通配路由:支持简单的通配模式(如
/images/
匹配/images/xxx
)。 - 并发安全:支持多 Goroutine 并发注册和调用路由。
基本用法
创建ServeMux
mux := http.NewServeMux() // 创建空路由 // 或直接使用默认的全局路由: // http.HandleFunc("/", handler) 会注册到 http.DefaultServeMux
注册路由
静态路径:
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Home Page")) })
统配路径:
mux.HandleFunc("/images/", func(w http.ResponseWriter, r *http.Request) { // 匹配 /images/xxx, /images/yyy/zzz 等 fmt.Fprintf(w, "Requested image: %s", r.URL.Path) })
自定义Hander:
type MyHandler struct{} func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Custom Handler")) } mux.Handle("/custom", &MyHandler{}) // 注册自定义 Handler
启动服务
http.ListenAndServe(":8080", mux) // 使用自定义 mux // 或使用默认路由: // http.ListenAndServe(":8080", nil) // 默认使用 http.DefaultServeMux
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: