路由中间件main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | package main import ( "fmt" "html/template" "time" "github.com/gin-gonic/gin" ) //时间戳转换成日期 func UnixToTime(timestamp int) string { fmt.Println(timestamp) t := time.Unix(int64(timestamp), 0) return t.Format( "2006-01-02 15:04:05" ) } func initMiddlewareOne(c *gin.Context) { fmt.Println( "1-我是一个中间件-initMiddlewareOne" ) //调用该请求的剩余处理程序 c.Next() fmt.Println( "2-我是一个中间件-initMiddlewareOne" ) } func initMiddlewareTwo(c *gin.Context) { fmt.Println( "1-我是一个中间件-initMiddlewareTwo" ) //调用该请求的剩余处理程序 c.Next() fmt.Println( "2-我是一个中间件-initMiddlewareTwo" ) } func main() { // 创建一个默认的路由引擎 r := gin.Default() //自定义模板函数 注意要把这个函数放在加载模板前 r.SetFuncMap(template.FuncMap{ "UnixToTime" : UnixToTime, }) //加载模板 放在配置路由前面 r.LoadHTMLGlob( "templates/**/*" ) //配置静态web目录 第一个参数表示路由, 第二个参数表示映射的目录 r.Static( "/static" , "./static" ) r.GET( "/" , initMiddlewareOne, initMiddlewareTwo, func (c *gin.Context) { fmt.Println( "这是一个首页" ) c.String(200, "gin首页" ) }) r.GET( "/news" , func (c *gin.Context) { c.String(200, "新闻页面" ) }) r.GET( "/login" , func (c *gin.Context) { c.String(200, "login" ) }) r.Run() } |
全局中间件main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package main import ( "fmt" "html/template" "time" "github.com/gin-gonic/gin" ) //时间戳转换成日期 func UnixToTime(timestamp int) string { fmt.Println(timestamp) t := time.Unix(int64(timestamp), 0) return t.Format( "2006-01-02 15:04:05" ) } func initMiddlewareOne(c *gin.Context) { fmt.Println( "1-我是一个中间件-initMiddlewareOne" ) //调用该请求的剩余处理程序 c.Next() fmt.Println( "2-我是一个中间件-initMiddlewareOne" ) } func initMiddlewareTwo(c *gin.Context) { fmt.Println( "1-我是一个中间件-initMiddlewareTwo" ) //调用该请求的剩余处理程序 c.Next() fmt.Println( "2-我是一个中间件-initMiddlewareTwo" ) } func main() { // 创建一个默认的路由引擎 r := gin.Default() //自定义模板函数 注意要把这个函数放在加载模板前 r.SetFuncMap(template.FuncMap{ "UnixToTime" : UnixToTime, }) //加载模板 放在配置路由前面 r.LoadHTMLGlob( "templates/**/*" ) //配置静态web目录 第一个参数表示路由, 第二个参数表示映射的目录 r.Static( "/static" , "./static" ) //全局中间件 r.Use(initMiddlewareOne, initMiddlewareTwo) r.GET( "/" , func (c *gin.Context) { fmt.Println( "这是一个首页" ) c.String(200, "gin首页" ) }) r.GET( "/news" , func (c *gin.Context) { c.String(200, "新闻页面" ) }) r.GET( "/login" , func (c *gin.Context) { c.String(200, "login" ) }) r.Run() } |
路由分组中间件 middlewares->init.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package middlewares import ( "fmt" "time" "github.com/gin-gonic/gin" ) func InitMiddleware(c *gin.Context) { //判断用户是否登录 fmt.Println(time.Now()) fmt.Println(c.Request.URL) c.Set( "username" , "张三" ) //定义一个goroutine统计日志 当在中间件或 handler 中启动新的 goroutine 时,不能使用原始的上下文(c *gin.Context), 必须使用其只读副本(c.Copy()) cCp := c.Copy() go func () { time.Sleep(2 * time.Second) fmt.Println( "Done! in path " + cCp.Request.URL.Path) }() } |
controllers->admin->indexController.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package routers import ( "gindemo08/controllers/admin" "gindemo08/middlewares" "github.com/gin-gonic/gin" ) func AdminRoutersInit(r *gin.Engine) { //middlewares.InitMiddleware中间件 adminRouters := r.Group( "/admin" , middlewares.InitMiddleware) { adminRouters.GET( "/" , admin.IndexController{}.Index) adminRouters.GET( "/user" , admin.UserController{}.Index) adminRouters.GET( "/user/add" , admin.UserController{}.Add) adminRouters.GET( "/user/edit" , admin.UserController{}.Edit) adminRouters.GET( "/article" , admin.ArticleController{}.Index) adminRouters.GET( "/article/add" , admin.ArticleController{}.Add) adminRouters.GET( "/article/edit" , admin.ArticleController{}.Edit) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?