如何将多个组添加到 gin 路由以进行 api 版本继承?

Ber*_*i92 4 go go-gin

我目前正在使用 Go + Gin 开发 API。

API 应包含版本字符串,例如字符串 v1

http://127.0.0.1:3000/v1/user/get_username
Run Code Online (Sandbox Code Playgroud)

那没问题,因为我可以用 Gin 创建一个组

v1 := router.Group("/v1")
v1.GET("/user/get_username", modules.UserGetUsername)
Run Code Online (Sandbox Code Playgroud)

但是...如果我开始一个新的 API 版本“v2”并且函数 UserGetUsername 中的代码没有改变,我必须执行以下操作

v1 := router.Group("/v1")
v1.GET("/user/get_username", modules.UserGetUsername)
v2 := router.Group("/v2")
v2.GET("/user/get_username", modules.UserGetUsername)
Run Code Online (Sandbox Code Playgroud)

有没有更好的解决方案 - 也许是这样的:

v1_v2 := router.Group("/v1").AnotherGroup("/v2")
v1_v2.GET("/user/get_username", modules.UserGetUsername)
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议。

Zoy*_*oyd 10

我不认为 Gin 提供了这个,但它看起来很容易编写。

type GroupGroup struct {
    groups []*gin.RouterGroup
}

func NewGroupGroup(groups []*gin.RouterGroup) GroupGroup {
    return GroupGroup {
        groups,
    }
}

func (g *GroupGroup) handle(method string, path string, handler gin.HandlerFunc) {
    for _, group := range g.groups {
        group.Handle(method, path, handler)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样使用它:

v1 := router.Group("/v1")
v2 := router.Group("/v2")

g := NewGroupGroup([]*gin.RouterGroup { v1, v2 })

g.handle(http.MethodGet, "hello", sayHello)
g.handle(http.MethodPost, "goodbye", sayGoodbye)
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢 - 这是一个非常好的解决方案! (2认同)