gorilla/mux
是 Go 语言中一个强大的 HTTP 路由库,属于 Gorilla Web Toolkit 的一部分。它提供了比标准库 net/http
更丰富的路由功能(如路径参数、中间件、子路由等),适合构建 RESTful API 或复杂 Web 服务。以下是详细指南:
1. 核心特性
- 灵活的路由匹配:支持路径、方法(GET/POST等)、域名、协议等条件。
- 路径参数:从 URL 中提取变量(如
/users/{id}
)。 - 中间件支持:可链式处理请求(日志、鉴权等)。
- 子路由:实现路由分组和嵌套。
- 兼容性:底层仍依赖
net/http
,可与标准库混合使用。
2. 基本用法
安装
go get -u github.com/gorilla/mux
示例1:基础路由
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Home Page")
}
func userHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
fmt.Fprintf(w, "User ID: %s", id)
}
func main() {
r := mux.NewRouter()
// 简单路由
r.HandleFunc("/", homeHandler).Methods("GET")
// 带参数的路由
r.HandleFunc("/users/{id}", userHandler).Methods("GET")
// 启动服务
http.ListenAndServe(":8080", r)
}
访问 http://localhost:8080/users/123
会输出 User ID:123
。
3. 高级功能
(1) 严格路径匹配
默认情况下,/path/
和 /path
会被视为相同。可通过 StrictSlash(true)
区分:
r := mux.NewRouter()
r.StrictSlash(true)
(2) HTTP方法限制
r.HandleFunc("/posts", createPost).Methods("POST")
r.HandleFunc("/posts/{id}", getPost).Methods("GET")
(3) Host或Scheme匹配
r.HandleFunc("/secure", secureHandler).Schemes("https")
r.HandleFunc("/admin", adminHandler).Host("admin.example.com")
(4) Query参数验证
r.HandleFunc("/search", searchHandler).
Queries("q", "{query}", "page", "{page:[0-9]+}")
仅匹配类似 /search?q=term&page=2
的URL。
4. Middleware (中间件)
自定义中间件示例
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("[%s] %s\n", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
r := mux.NewRouter()
r.Use(loggingMiddleware) //全局应用中间件
r.HandleFunc("/", homeHandler)
}
常用第三方中间件
github.com/gorilla/handlers
:提供日志、CORS等。github.com/unrolled/render
:响应格式化。
5. Subrouter (子路由)
适用于API版本化或模块化分组:
func main() {
r := mux.NewRouter()
// /api/v1/*
s1 := r.PathPrefix("/api/v1").Subrouter()
s1.HandleFunc("/users", v1.GetUsers)
// /api/v2/*
s2 := r.PathPrefix("/api/v2").Subrouter()
s2.Use(authMiddleware) //仅对v2生效
s2.HandleFunc("/users", v2.GetUsers)
http.ListenAndServe(":8080", r)
}
6. vs Gin/Echo等其他框架
gorilla/mux |
gin/echo/fiber |
|
---|---|---|
定位 | 纯路由库 | 全栈Web框架 |
性能 | 中等(基于net/http) | 更高(优化实现) |
功能 | 基础路由+扩展 | 内置JSON渲染、错误处理等 |
7. FAQ常见问题
(1) CORS支持?
需配合第三方库(如 github.com/rs/cors
):
import "github.com/rs/cors"
handler := cors.Default().Handler(r)
http.ListenAndServe(":8080", handler)
(2) JSON响应如何简化?
结合标准库或辅助包:
import "encoding/json"
func jsonResponse(w http.ResponseWriter, data interface{}) {
w.Header().Set("Content-Type","application/json")
json.NewEncoder(w).Encode(data)
}
通过 gorilla/mux
,你可以灵活构建复杂的 HTTP API,同时保持与 Go 标准库的良好兼容性。如需更全面的 Web框架功能,可评估 Gin/Echo/Fiber等替代方案。
内容由零声教学AI助手提供,问题来源于学员提问