1. 引言
net/http 是 Go 标准库中最常用的包之一,它同时提供了 HTTP 客户端与服务端的实现。得益于标准库的完整性和 Go 的并发模型,我们无需引入任何第三方框架,就能快速构建一个生产可用的 HTTP 服务。
本文围绕日常开发中最常见的场景,梳理 net/http 的核心用法,包括服务端路由、请求处理、中间件、客户端请求、超时控制与优雅关闭等,并给出可直接运行的示例代码。
2. 快速开始:一个最小的 HTTP 服务
使用 http.HandleFunc 注册路由,再调用 http.ListenAndServe 启动服务,是最简单的写法。
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", r.URL.Query().Get("name"))
})
log.Println("server listening on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
运行后访问 http://localhost:8080/hello?name=Go,即可看到返回结果。
需要注意:http.ListenAndServe 的第二个参数为 nil 时,使用的是 http.DefaultServeMux 这个全局默认路由器。在稍大的项目中,更推荐显式创建自己的 ServeMux,避免全局状态带来的隐式耦合。
3. 路由与 ServeMux
3.1 基础路由注册
http.ServeMux 支持按路径前缀匹配,以 / 结尾的模式表示子树匹配。
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("index"))
})
mux.HandleFunc("/api/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("api prefix"))
})
mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("users"))
})
匹配规则是「最长前缀优先」,因此 /api/users 会优先于 /api/ 命中。
3.2 Go 1.22 之后的方法与路径参数
从 Go 1.22 开始,ServeMux 支持在模式中声明 HTTP 方法和路径通配符,这让标准库路由能力大幅增强。
mux := http.NewServeMux()
mux.HandleFunc("GET /users/{id}", func(w http.<
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/u011175571/article/details/170656635



