最近在用Go的Gin框架写点东西,添加API的路由的时候每次都要在引用gin的地方修改增加路由规则,而且多人协同的话很容易发生冲突,所以在想能不能每次编写一个handlerFunc的时候可以自动加载进Gin中,经过研究后发现可以利用Go的反射机制来实现相关功能。
基本的思想:
在实现hanlderFunc的包中定义一个结构体
type Helper struct {
}
然后为这个结构体定义不同的方法,该方法返回HandlerFunc函数以及相关的路由信息。
之后在包的外部实现一个反射函数,将Helper传入函数中,利用反射获取结构体所有的方法,并且逐一调用,这样子就可以实现只要在包外定义一个语句后把包中所有的handlerFunc都调用。
这种方法应该也可以使用在其他的框架上,因为现在暂时只用Gin所以就写了一个ginHelper包可以直接调用实现。
CCChieh/ginHelpergithub.comginHelper
ginHelper
是一个自动把handlerFunc
添加到Gin
并且设置路由的工具包。
- 在存放
handlerFunc
的文件夹中任意位置写下
type helper struct {
}
- 之后每次写
handlerFunc
的时候都类似下方的helloHandler
前面加上一个*helper
的一个方法HelloHandler()
中设置路由。
func (h *Helper) HelloHandler() (r *ginHelper.Router) {
return &ginHelper.Router{
Path: "/HelloHandler",
Method: "GET",
Handlers: []gin.HandlerFunc{
helloHandler,
}}
}
func helloHandler(c *gin.Context) {
c.String(http.StatusOK, "Hello world!")
}
- 在运行gin的时候
r := gin.New()
自动导入handler文件夹中的所有路由
ginHelper.Build(new(handler.Helper), r)
将user文件夹中所有的路由导入到同一个路由组中
ginHelper.Build(new(user.Helper), r.Group("/user"))