go - 如何在运行前通过 gin 合并多个路由器
问题描述
假设我在这样的subemenuRoutes.go
文件中有一些路由:
package routes
import(
"github.com/IamFrost/api-5/pkg/middlewares"
"github.com/gin-gonic/gin"
)
// GetSubMenuRoutes return a group of routes for login
func GetSubMenuRoutes() *gin.Engine{
router := gin.Default()
menuRoutes := router.Group("/submenu")
{
getRoutes := menuRoutes.Group("/get")
{
getRoutes.GET("/getallsubmenus", middlewares.GetAllSubMenus)
}
}
return router
}
我是这样运行它们的main.go
:
package main
import(
"fmt"
"github.com/IamFrost/api-5/pkg/routes"
"github.com/gin-gonic/gin"
"github.com/gin-contrib/cors"
)
func main(){
fmt.Println("from main")
router := gin.Default()
router = routes.GetSubMenuRoutes()
router.Use(cors.Default())
router.Run(":3000")
}
至此,一切正常。
现在我的问题是:
假设我在文件中有一些其他路线menuRoutes.go
:
package routes
import(
"github.com/IamFrost/api-5/pkg/middlewares"
"github.com/gin-gonic/gin"
)
// GetMenuRoutes return a group of routes for login
func GetMenuRoutes() *gin.Engine{
router := gin.Default()
menuRoutes := router.Group("/menu")
{
getRoutes := menuRoutes.Group("/get")
{
getRoutes.GET("/getallmenus", middlewares.GetAllMenus)
}
}
return router
}
现在,我想从 main运行菜单路由和子菜单路由。
但是在我的main.go
,你看,我在跑步之前做了这个,
router = routes.GetSubMenuRoutes()
那么如何合并来自routes.GetSubMenuRoutes()
和的所有路线routes.GetMenuRoutes()
在我打电话router.Run
之前main.go
?
更新:
正如他们的医生所说,我想要这样的东西main.go
,但我的路线来自功能。你看:我不能像 v1 或 v2 那样硬编码我的路线,因为我的路线来自getMenuRoute()
和getSubmenuRoute()
功能
func main() {
router := gin.Default()
// Simple group: v1
v1 := router.Group("/v1")
{
v1.POST("/login", loginEndpoint)
v1.POST("/submit", submitEndpoint)
v1.POST("/read", readEndpoint)
}
// Simple group: v2
v2 := router.Group("/v2")
{
v2.POST("/login", loginEndpoint)
v2.POST("/submit", submitEndpoint)
v2.POST("/read", readEndpoint)
}
router.Run(":8080")
}
解决方案
gin.Default()
您可以将其作为参数传递给路由器函数,而不是在每个函数内部声明。
func GetMenuRoutes(router *gin.Engine){
menuRoutes := router.Group("/menu")
{
getRoutes := menuRoutes.Group("/get")
{
getRoutes.GET("/getallmenus", middlewares.GetAllMenus)
}
}
return
}
或者
您可以使用 for 循环将所有这些路由注册到主路由器。
您main func()
将有以下几行
func main() {
v1 := getGroup1().Routes()
v2 := getGroup2().Routes()
rt := gin.Default()
for _, a := range v1 {
{
rt.Handle(a.Method, a.Path, a.HandlerFunc)
}
}
for _, a := range v2 {
{
rt.Handle(a.Method, a.Path, a.HandlerFunc)
}
}
rt.Run(":8080")
}
推荐阅读
- python - 循环读取两个文件的内容
- r - 当我在 R 中连接时,我是在创建行还是列?
- c++ - 使用参数包生成对象
- mysql - 触发更新所有行
- php - PHP Mysqli mcrypt_get_iv_size 已弃用,如何使用新功能?
- python - 无论图形大小如何,您能否在 matplotlib 中强制图形子图的 wspace 和 hspace 为固定值
- routes - Laravel-8 . 删除帖子时出现 404 错误页面
- encryption - 2012R2 TLS 1.2 强密码套件不工作
- pyspark - 如何在 Spark/PySpark 的数据框中对包含空值的两列求和?
- microsoft-graph-api - 使用 Azure Durable Function 进行图形批处理