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 处理;

 

浏览 4
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

编辑 分享
举报