路由表map实现

使用数组实现的简单路由模块的示例代码,包括路由注册和匹配功能

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值