如何在 运行 之前通过 gin 合并多个路由器

How to merge multiple router via gin before run

假设我在 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
}

现在,我想 运行 menu routessubmenu routes from main .

但是在我的 main.go 中,你看,我在 运行ning,

之前就这样做了
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")
   }

@whitespace 的回答很好。但是我找到了另一个解决方案。

所以,正如你所记得的,我有很多路由来自 2 个函数。

我需要合并它们,然后 main 调用它们

所以我的第一个路由函数来自:menuRoutes.go

    package routes
    
    import(
        "github.com/IamFrost/api-5/pkg/middlewares"
    
        "github.com/gin-gonic/gin"
    )
    
    // GetMenuRoutes return a group of routes for menu
    func GetMenuRoutes(router *gin.Engine) *gin.Engine{
    
        menuRoutes := router.Group("/menu")
        {
            getRoutes := menuRoutes.Group("/get")
            {
                getRoutes.GET("/getallmenus", middlewares.GetAllMenus)
            }
        }
    
        return router
    }

我的第二个路由函数来自:submenuRoutes.go

package routes

import(
    "github.com/IamFrost/api-5/pkg/middlewares"

    "github.com/gin-gonic/gin"
)


// GetSubMenuRoutes return a group of routes for submenu
func GetSubMenuRoutes(router *gin.Engine) *gin.Engine{

    menuRoutes := router.Group("/submenu")
    {
        getRoutes := menuRoutes.Group("/get")
        {
            getRoutes.GET("/getallsubmenus", middlewares.GetAllSubMenus)
        }
    }
    // router.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()

    routes.GetMenuRoutes(router)
    routes.GetSubMenuRoutes(router)


    router.Use(cors.Default())
    router.Run(":3000")
}