【问题标题】:How to combine group of routes in gin?如何在杜松子酒中组合一组路线?
【发布时间】:2025-12-17 02:25:02
【问题描述】:

我在两个不同的包中为gin 路由创建了两个不同的组,特别是/user/todo,我想将它们合并到一个文件中。这是我的userroutes.go 文件。

package userrouter

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

//UserRoutes for user
func UserRoutes() *gin.RouterGroup {

    r := gin.Default()

    v1 := r.Group("/user")
    {

        v1.GET("/hello", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })

    }
    return v1

}

todoroutes.go 一样

package todorouter

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

//TodoRoutes for creating Todo
func TodoRoutes() *gin.RouterGroup {

    r := gin.Default()

    v2 := r.Group("/todo")
    {

        v2.GET("/hello", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })

    }
    return v2

}

然后想将它们合并到routes.go

package router

import (
    todo "TODO/api/Routes/Todo/TodoRoutes"
    user "TODO/api/Routes/User/UserRoutes"
    "fmt"

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


//Router for all routes
func Router() {
    // r := gin.Default()
    userRoutes := user.UserRoutes()
    todoRoutes := todo.TodoRoutes()

}

如何将它们合并到一个文件中,以便可以使用某些前缀 /api 获取它们,例如 localhost:8081/api/user/createlocalhost:8081/api/todo/create。另外,我是否需要在我创建的每条路线中创建r := gin.Default(),或者可以使用一次来完成?谢谢。

【问题讨论】:

    标签: go go-gin


    【解决方案1】:

    只需创建一个超级组,然后在其下创建您的组。代码示例来说明我的意思:

        router := gin.New()
        
        superGroup := router.Group("/api")
        {
            userGroup := superGroup.Group("/user")
            {
                // user group handlers
            }
        
            todoGroup := superGroup.Group("/todo")
            {
                // todo group handlers
            }
        }
    
    

    使用此代码,您无法像现在这样创建组,因为您的函数todorouter.TodoRoutesuserrouter.UserRoutes 都实例化了它们自己的gin.Engine。所以你必须把*引擎和/api组移动到一个共同的地方。

    如果需要,您可以将 api 组对象作为函数参数传递。示例:

    //TodoRoutes for creating Todo
    func TodoRoutes(apiGroup *gin.RouterGroup) {
    
        v2 := apiGroup.Group("/todo")
        {
    
            v2.GET("/hello", func(c *gin.Context) {
                c.JSON(200, gin.H{
                    "message": "pong",
                })
            })
    
        }
    }
    

    不过,为了让您的代码井井有条,我的建议是在同一个地方实例化所有路由器,然后将处理程序放在单独的包中。

    // package todoroutes
    func HandleHello(c *gin.Context) {
                c.JSON(200, gin.H{
                    "message": "pong",
                })
    }
    
    // package router
        router := gin.New()
        
        superGroup := router.Group("/api")
        {
            userGroup := superGroup.Group("/user")
            {
                 userGroup.GET("/hello", todoroutes.HandleHello)
            }
        }
    
    

    【讨论】:

    • 感谢您的回复。虽然我对最后的建议有一个疑问。如果我继续在 userGroup 中添加路由或说 todoGroup,它会不会变得有点混乱?只是一个想法
    • 如果所有子路由在逻辑上都属于/user/todo 组,那么无论如何它们都应该去那里。只要您保持路由器和处理程序文件井井有条,它就不会特别混乱。我目前为每个组有 10-20 条路线,每当我需要添加一条时,我就添加它。