首页 > 解决方案 > 如何在运行前通过 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")
}

标签: goroutesgo-gin

解决方案


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")
   }

推荐阅读