使用数组实现的简单路由模块的示例代码,包括路由注册和匹配功能
package router
import "net/http"
// Route 表示一个路由信息
type Route struct {
Method string // HTTP方法,如GET、POST等
Path string // 路径,如"/user/:id"
Handler http.HandlerFunc // 处理函数
}
// Router 表示一个路由器
type Router struct {
routes []Route // 路由表
}
// NewRouter 创建一个新的路由器
func NewRouter() *Router {
return &Router{
routes: make([]Route, 0),
}
}
// Handle 注册一个路由信息
func (r *Router) Handle(method string, path string, handler http.HandlerFunc) {
route := Route{
Method: method,
Path: path,
Handler: handler,
}
r.routes = append(r.routes, route)
}
// ServeHTTP 实现http.Handler接口,用于处理请求
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
for _, route := range r.routes {
if route.Method == req.Method && matchPath(route.Path, req.URL.Path) {
route.Handler(w, req)
return
}
}
// 没有找到匹配的路由,返回404错误
http.NotFound(w, req)
}
// matchPath 判断请求路径是否匹配路由路径
func matchPath(routePath, reqPath string) bool {
routeParts := strings.Split(routePath, "/")
reqParts := strings.Split(reqPath, "/")
if len(routeParts) != len(reqParts) {
return false
}
for i, part := range routeParts {
if strings.HasPrefix(part, ":") {
// 参数匹配
continue
}
if part != reqParts[i] {
return false
}
}
return true
}
package main
import (
"fmt"
"net/http"
"github.com/yourname/router"
)
func main() {
r := router.NewRouter()
r.Handle(http.MethodGet, "/users/:id", func(w http.ResponseWriter, req *http.Request) {
id := req.URL.Query().Get("id")
fmt.Fprintf(w, "User ID: %s\n", id)
})
http.ListenAndServe(":8080", r)
}
在上面的示例中,我们创建了一个Router
对象,并注册了一个路由信息,即GET方法的路径为/users/:id
的路由,处理函数为输出请求中的id
参数。
当我们启动应用程序并访问http://localhost:8080/users/123?id=123
时,将会匹配到注册的路由,并执行对应的处理函数输出User ID: 123
。