issue9/mux功能完备的 Go 路由器

联合创作 · 2023-10-01 11:24

通过范型功能,可以很方便地实现一个自定义的路由:


type Context struct {
R *http.Request
W http.ResponseWriter
P Params
}

type HandlerFunc func(ctx *Context)

type Router = RouterOf[HandlerFunc]
type Prefix = PrefixOf[HandlerFunc]
type Resource = ResourceOf[HandlerFunc]
type MiddlewareFunc = MiddlewareFuncOf[HandlerFunc]
type Middleware = MiddlewareOf[HandlerFunc]
type Options = OptionsOf[HandlerFunc]

func New(name string, ms []Middleware, o ...Option)* Router {
f := func(w http.ResponseWriter, r *http.Request, ps Params, h HandlerFunc) {
ctx := &Context {
R: r,
W: w,
P: ps,
}
h(ctx)
}
return NewRouterOf[HandlerFunc](name, f, ms, o...)
}

// 以上就是自定义路由的全部功能,之后就可以直接使用:

r := New("router", nil)

r.Get("/path", func(ctx *Context){
// TODO
ctx.W.WriteHeader(200)
})

r.Prefix("/admin").Get("/login", func(ctx *Context){
// TODO
ctx.W.WriteHeader(501)
})

所有实现的路由,都支持以下功能:



  • 路由参数;

  • 支持正则表达式作为路由项匹配方式;

  • 拦截正则表达式的行为;

  • 自动生成 OPTIONS 请求处理方式;

  • 自动生成 HEAD 请求处理方式;

  • 根据路由反向生成地址;

  • 任意风格的路由,比如 discuz 这种不以 / 作为分隔符的;

  • 分组路由,比如按域名,或是版本号等;

  • CORS 跨域资源的处理;

  • 支持中间件;

  • 自动生成 OPTIONS * 请求;

  • 静态文件系统;

  • TRACE 请求方法的支持;

  • panic 处理;


 

浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报