Golang Go语言中使用 go generics 自定义路由
自己写的库 https://github.com/issue9/mux 基于 go1.18 的范型功能,实现对路由处理函数签名的自定义。
type (
Context struct {
R *http.Request
W http.ResponseWriter
P mux.Params
}
Handler interface {
Handle(*Context)
}
HandlerFunc func(*Context)
Router = mux.RouterOf[Handler]
Prefix = mux.PrefixOf[Handler]
Resource = mux.ResourceOf[Handler]
Middleware = mux.MiddlewareOf[Handler]
Options = mux.OptionsOf[Handler]
)
func (f HandlerFunc) Handle(c *Context) { f© }
func call(w http.ResponseWriter, r *http.Request, ps mux.Params, h Handler) {
h.Handle(&Context{R: r, W: w, P: ps})
}
func NewRouter(name string, o Options) *Router {
opt := &options{}
for _, oo := range o {
oo(opt)
}
return NewRouterOf[Handler](name, call, opt)
}
仅需 100 行不到的代码就可以实现一个功能完备的路由功能。很适合作为框架的路由实现。
Golang Go语言中使用 go generics 自定义路由
更多关于Golang Go语言中使用 go generics 自定义路由的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
借楼,我想不通为什么主流 Go Web 框架要用 :param 作为路径参数,有没有不是用 :param 的,实现谷歌的 /resource/name:customVerb 这种 URI 设计风格。
更多关于Golang Go语言中使用 go generics 自定义路由的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
为解析简单一些吧。我更懒一些,直接用 /resource/{name:verb} 的形式,拿大括号中的内容就行。
#2 要实现 google 风格的话,/resource/{name:rule}:{verb:rule} 就可以了。
还是喜欢签名为 (w http.ResponseWriter, r *http.Request) 的库,和标准库切换没有成本。
这个库的作用就是让用户可以自定义这个函数签名。不过默认提供了一个支持 (w http.ResponseWriter, r *http.Request)
的实现:Router
。
在Go语言中,使用go generics
自定义路由是一种类型安全且灵活的方式来处理HTTP请求。go generics
(泛型)是Go 1.18引入的一项特性,允许你编写与类型无关的代码,这在构建路由系统时尤其有用。
首先,你可以定义一个泛型路由结构体,该结构体接受一个泛型类型参数T
,这个T
代表路由处理器(handler)的类型。例如,你可能希望处理器实现一个特定的接口,如http.Handler
。
然后,你可以定义一个添加路由的方法,该方法接受一个路径和一个处理器。由于使用了泛型,这个方法可以处理任何实现了http.Handler
接口的处理器类型。
在路由匹配阶段,你可以遍历路由表,查找与请求路径匹配的路由,并调用相应的处理器。由于使用了泛型,这个过程是类型安全的,你可以在编译时就捕捉到类型不匹配的错误。
使用go generics
自定义路由的好处之一是代码的可重用性和可维护性。你可以编写一次泛型路由代码,然后在整个项目中重用,而无需为每种处理器类型编写特定的路由代码。
然而,也需要注意,由于go generics
是相对较新的特性,可能需要一些时间来熟悉和掌握。此外,过度使用泛型可能会使代码变得难以理解和维护,因此在使用时应权衡利弊。
总之,go generics
为Go语言中的自定义路由提供了一种强大的工具,可以帮助你编写更加类型安全和灵活的代码。