go语言web框架gin的router注册和controller注册以及中间件的使用

说说我个人的见解,为更好地分层,在使用gin时,我会做一些事情

首先是controller的抽象

//具体controller的信息
type controllerInfo struct {
	method      bool //true是get,false是post
	path        string//请求地址
	controlFunc func(*gin.Context)//要干的事情
}

//controller的集合
type Controller struct {
	controllerMap map[int]controllerInfo
}

//设置一个集合中的方法
func SetController(c *Controller, s string, f func(*gin.Context), method bool) *Controller {
	c.controllerMap[len(c.controllerMap)] = controllerInfo{method, s, f}
	return c
}

//新建一个集合
func NewController() *Controller {
	controller := Controller{controllerMap: make(map[int]controllerInfo)}
	return &controller
}

然后是router的注册

//把controller的集合注册进gin的引擎里
func SetRouter(r *gin.Engine, groupName string, controller *Controller) {
	group := r.Group(groupName)
	for i := 0; i <= len(controller.controllerMap)-1; i++ {
		if controller.controllerMap[i].method {
			group.GET(controller.controllerMap[i].path, controller.controllerMap[i].controlFunc)
		} else {
			group.POST(controller.controllerMap[i].path, controller.controllerMap[i].controlFunc)
		}
	}

}

接下来比如我们有一个具体的业务函数,就可以结合起来使用

//具体业务代码
func test(c *gin.Context) {
	c.JSON(200, gin.H{"msg": "ok"})
}

func test2(c *gin.Context) {
	c.JSON(200, gin.H{"msg": "okok"})
}

func main() {
	r := gin.Default()
	controller := NewController()
	SetController(controller, "/test", test, true)
	SetController(controller, "/test2", test2, true)
	SetRouter(r, "/api", controller)
	r.Run(":8083")
}

运行它,访问/api/test可以得到

{"msg":"ok"}

访问/api/test2可以得到

{"msg":"okok"}

如此一来可以很方便地分层

接下来是中间件的编写

//这是一个计算从此中间件开始到结束的方法
func costTime() gin.HandlerFunc {
//直接返回一个gin.HandlerFunc函数,里面是中间件的逻辑
	return func(ctx *gin.Context) {
		nowTime := time.Now()
		ctx.Next()//这一句的作用是执行中间件链上的下一个中间件,在此之前的代码会先执行,在后的后执行
		costTime := time.Since(nowTime)
		fmt.Printf("costTime结果:" + costTime.String())
	}
}

然后是中间件的使用

	r := gin.Default()
	r.Use(costTime())

非常简单,这样就算把中间件加入到执行链上了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值