gin框架 路由拆分与注册
★基本的路由注册
最基础的gin路由注册方式,适用于路由条目比较少的简单项目或者项目demo
package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func helloHander(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello www.topgoer.com!", }) } func main() { r := gin.Default() r.GET("/topgoer", helloHander) if err := r.Run(); err != nil { fmt.Printf("startup server failed,err:%v\n", err) } }
★路由拆分成单独文件或包
当项目的规模增大后就不太适合继续在项目的main.go文件中去实现路由注册相关逻辑了,我们会倾向于把路由部分的代码都拆分出来,形成一个单独的文件或包:
我们在routers.go文件中定义并注册路由信息:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func helloHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello www.ckfuture.com!", }) } func setupRouter() *gin.Engine { r := gin.Default() r.GET("/ckfuture", helloHandler) return r }
此时main.go中调用上面定义好的setupRouter函数:
package main import "fmt" func main() { r := setupRouter() if err := r.Run(); err != nil { fmt.Printf("startup service failed,err:%v\n", err) } }
此时的目录结构:main.go和router.go在相同的文件夹下
把路由部分的代码单独拆分成包的话也是可以的,拆分后的目录结构如下:
routers/routers.go需要注意此时setupRouter需要改成首字母大写:
package routers
import ( "net/http" "github.com/gin-gonic/gin" ) func helloHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello www.ckfuture.com!", }) } func SetupRouter() *gin.Engine { r := gin.Default() r.GET("/ckfuture", helloHandler) return r }
main.go文件内容如下:
package main import ( "fmt" "src/main/src/go_code/project01/routers" ) func main() { r := routers.SetupRouter() if err := r.Run(); err != nil { fmt.Printf("startup service failed,err:%v\n", err) } }
★路由拆分成多个文件
当我们的业务规模继续膨胀,单独的一个routers文件或包已经满足不了我们的需求了,因为我们把所有的路由注册都写在一个SetupRouter函数中的话就会太复杂了。
我们可以分开定义多个路由文件,例如:
routers/shop.go中添加一个LoadShop的函数,将shop相关的路由注册到指定的路由器:
package routers import ( "net/http" "github.com/gin-gonic/gin" ) func LoadShop(e *gin.Engine) { e.GET("/hello", helloHandler) } func helloHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello www.topgoer.com", }) }
routers/blog.go中添加一个LoadBlog的函数,将blog相关的路由注册到指定的路由器:
package routers import ( "net/http" "github.com/gin-gonic/gin" ) func LoadBlog(e *gin.Engine) { e.GET("/post", postHandler) } func postHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello www.topgoer.com", }) }
在main函数中实现最终的注册逻辑如下:
package main import ( "fmt" "src/main/src/routers" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() routers.LoadBlog(r) routers.LoadShop(r) if err := r.Run(); err != nil { fmt.Printf("startup service failed, err:%v\n", err) } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!