golang极速HTTP路由器完全兼容net/http.Handler接口插件库gowww/router的使用
gowww/router - 极速HTTP路由器完全兼容net/http.Handler接口
特性
- 极高性能:在大多数情况下可实现亚微秒级路由
- 完全兼容标准库的
http.Handler
接口 - 通用性:没有魔法方法,使用你自己的处理器
- 支持路径参数、正则表达式和通配符
- 智能优先级路由
- 服务时零内存分配(参数除外)
- 遵循最小意外原则
- 经过测试并用于生产环境
安装
- 获取包:
go get -u github.com/gowww/router
- 导入到你的代码中:
import "github.com/gowww/router"
使用示例
基本使用
package main
import (
"fmt"
"net/http"
"github.com/gowww/router"
)
func main() {
// 1. 创建新路由器
r := router.New()
// 2. 添加路由
r.Handle("GET", "/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
}))
// 3. 启动服务器
http.ListenAndServe(":8080", r)
}
命名参数
// 添加带命名参数的路由
r.Get("/users/:id", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := router.Parameter(r, "id")
fmt.Fprintf(w, "User ID: %s", id)
}))
正则表达式参数
// 只匹配数字ID
r.Get(`/users/:id:^\d+$`, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := router.Parameter(r, "id")
fmt.Fprintf(w, "Numeric User ID: %s", id)
}))
// 不需要获取参数值,只使用正则表达式
r.Get(`/shows/::^prison-break-s06-.+`, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Prison Break S06 — Coming soon...")
}))
通配符路由
// 匹配/files/后面的任何路径
r.Get("/files/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
filepath := router.Parameter(r, "*")
fmt.Fprintf(w, "Requested file: %s", filepath)
}))
静态文件服务
// 使用标准库的FileServer提供静态文件
r.Get("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
自定义404处理器
// 设置自定义的NotFound处理器
r.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "Custom 404 Page - Not Found")
})
完整示例
package main
import (
"fmt"
"net/http"
"github.com/gowww/router"
)
func main() {
r := router.New()
// 首页
r.Get("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Welcome to the Home Page")
}))
// 用户页面
r.Get("/users/:id", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := router.Parameter(r, "id")
fmt.Fprintf(w, "User Profile Page - ID: %s", id)
}))
// 产品页面 - 只匹配数字ID
r.Get(`/products/:id:^\d+$`, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := router.Parameter(r, "id")
fmt.Fprintf(w, "Product Details - ID: %s", id)
}))
// 静态文件服务
r.Get("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("public"))))
// 自定义404
r.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "404 - Page Not Found")
})
// 启动服务器
fmt.Println("Server running on :8080")
http.ListenAndServe(":8080", r)
}
gowww/router是一个高性能、完全兼容标准库的HTTP路由器,提供了简洁的API和强大的路由功能,适合构建各种Web应用和服务。
更多关于golang极速HTTP路由器完全兼容net/http.Handler接口插件库gowww/router的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang极速HTTP路由器完全兼容net/http.Handler接口插件库gowww/router的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gowww/router - Go极速HTTP路由器完全兼容net/http.Handler接口
gowww/router是一个高性能、轻量级的Go语言HTTP路由器,完全兼容net/http.Handler接口,适合构建快速、灵活的Web应用。
主要特性
- 极高性能的路由匹配
- 完全兼容标准库net/http.Handler接口
- 支持参数化路由
- 支持路由组和中间件
- 简洁直观的API设计
安装
go get github.com/gowww/router
基本使用示例
package main
import (
"fmt"
"net/http"
"github.com/gowww/router"
)
func main() {
r := router.New()
// 简单路由
r.Handle("GET", "/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
}))
// 带参数的路由
r.Handle("GET", "/user/:name", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
name := router.Params(r).Get("name")
fmt.Fprintf(w, "Hello, %s!", name)
}))
// 支持多种HTTP方法
r.Handle("POST", "/submit", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Form submitted!")
}))
// 启动服务器
http.ListenAndServe(":8080", r)
}
高级特性
路由组和中间件
func main() {
r := router.New()
// 创建路由组
api := r.Group("/api")
// 为路由组添加中间件
api.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 验证API密钥等预处理
if r.Header.Get("X-API-Key") != "secret" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
})
// 路由组内的路由
api.Handle("GET", "/users", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "User list")
}))
http.ListenAndServe(":8080", r)
}
文件服务器
func main() {
r := router.New()
// 静态文件服务
r.Handle("GET", "/static/*filepath", http.StripPrefix("/static/",
http.FileServer(http.Dir("public"))))
http.ListenAndServe(":8080", r)
}
自定义404处理
func main() {
r := router.New()
// 自定义404处理
r.NotFound = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "Custom 404 - Page Not Found")
})
http.ListenAndServe(":8080", r)
}
性能优化技巧
- 避免在热路径上分配内存:在处理器中尽量减少内存分配
- 使用sync.Pool重用对象:特别是对于频繁创建销毁的对象
- 预编译正则表达式:如果使用正则路由,提前编译
- 合理使用中间件:避免不必要的中间件处理
与标准库net/http的对比
gowww/router在保持与标准库完全兼容的同时,提供了更强大的路由功能:
- 参数化路由(标准库不支持)
- 路由组管理(标准库需要自行实现)
- 更高效的路由匹配算法
- 内置中间件支持
总结
gowww/router是一个非常适合需要高性能路由的Go Web项目的选择,它既保留了标准库的简洁性,又提供了现代Web框架的路由功能。其完全兼容net/http.Handler接口的特性使得它可以无缝集成到现有项目中,也可以轻松与其他中间件配合使用。
对于大多数Web应用来说,gowww/router在性能和功能之间取得了很好的平衡,是构建Go Web服务的优秀选择。