Golang Go语言中使用 go generics 自定义路由

发布于 1周前 作者 gougou168 来自 Go语言

自己写的库 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

6 回复

借楼,我想不通为什么主流 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语言中的自定义路由提供了一种强大的工具,可以帮助你编写更加类型安全和灵活的代码。

回到顶部