答案:Go语言通过net/http包实现HTTP中间件,利用函数包装和链式调用完成日志、认证等功能。示例展示loggingMiddleware记录请求耗时,authMiddleware校验token,通过wrapHandler封装多个中间件,提升代码可读性。中间件按顺序嵌套执行,适用于标准库或自定义路由场景,体现装饰器模式与接口抽象的设计思想。

在Go语言中实现HTTP路由中间件,通常基于net/http包或使用像Gin、Echo这样的Web框架。下面以标准库为例,展示如何构建简洁、可复用的中间件机制,并结合实际场景说明用法。
中间件是一个函数,接收http.Handler并返回一个新的http.Handler。它可以在请求到达最终处理函数之前或之后执行逻辑,比如记录日志、验证身份、设置头部等。
示例:日志中间件
这个中间件打印每次请求的方法、路径和响应耗时。
立即学习“go语言免费学习笔记(深入)”;
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
})
}多个中间件可以逐层包装,形成处理链。顺序很重要——越外层的中间件越早进入,越晚退出。
示例:身份验证中间件
检查请求头是否包含有效token。
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if token != "secret-token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}组合中间件与路由
将中间件应用到特定路由上:
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/public", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("公开接口"))
})
mux.Handle("/admin", loggingMiddleware(authMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("管理员接口"))
}))))
log.Println("服务启动在 :8080")
http.ListenAndServe(":8080", mux)
}为了提升可读性,可以定义一个辅助类型来简化中间件堆叠。
type Middleware func(http.Handler) http.Handler
func wrapHandler(h http.HandlerFunc, middleware ...Middleware) http.Handler {
var wrapped http.Handler = h
for _, m := range middleware {
wrapped = m(wrapped)
}
return wrapped
}使用封装后的中间件链
更清晰地组织代码:
mux.Handle("/api/data", wrapHandler(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`{"data": "ok"}`))
}, loggingMiddleware, authMiddleware))基本上就这些。通过函数组合的方式,Golang能非常干净地实现HTTP中间件模式,无需依赖框架也能写出结构清晰的服务。关键是理解http.Handler的接口抽象和装饰器思路。
以上就是Golang HTTP路由中间件实现示例的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号