issue9/mux功能完備的 Go 路由器
通過范型功能,可以很方便地實(shí)現(xiàn)一個(gè)自定義的路由:
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)
})
所有實(shí)現(xiàn)的路由,都支持以下功能:
- 路由參數(shù);
- 支持正則表達(dá)式作為路由項(xiàng)匹配方式;
- 攔截正則表達(dá)式的行為;
- 自動(dòng)生成 OPTIONS 請(qǐng)求處理方式;
- 自動(dòng)生成 HEAD 請(qǐng)求處理方式;
- 根據(jù)路由反向生成地址;
- 任意風(fēng)格的路由,比如 discuz 這種不以 / 作為分隔符的;
- 分組路由,比如按域名,或是版本號(hào)等;
- CORS 跨域資源的處理;
- 支持中間件;
- 自動(dòng)生成 OPTIONS * 請(qǐng)求;
- 靜態(tài)文件系統(tǒng);
- TRACE 請(qǐng)求方法的支持;
- panic 處理;
評(píng)論
圖片
表情
