运行前如何通过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.HandlerFunc)
        }
    }
    rt.Run(":8080")
   }
,

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

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

我需要合并它们,然后再将它们全部调用

所以我的第一个路由功能来自: 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")
}