如何从其他包导入子路由

How to import sub-routes from other packages

而不是在 main() 下写每条路由,比如

func main() {
    e := echo.New()
    e.GET("/api", sayHello)
    e.GET("/api/music", getMusic)
    e.GET("/api/user/:id", getDetail)
    e.POST("/api/user", addUser)
    // ...
}

如何从名为 api.go 的文件中导入这些所有子路由,并在主函数中使用它们?类似于

import "./API"
func main() {
    e := echo.New()
    e.UseSubroute(API.Routes) // <-- similar to this
    // ...
}

Echo对象没有这个方法。我想你需要代码?

API.go:

package main

import "github.com/labstack/echo"

func UseSubroute(echo *echo.Echo)  {
    echo.GET("/api", sayHello)
    echo.GET("/api/music", getMusic)
    echo.GET("/api/user/:id", getDetail)
    echo.POST("/api/user", addUser)
}

main.go:

package main

import "github.com/labstack/echo"

func main() {
    e := echo.New()
    UseSubroute(e)
}

这两个文件需要放在同一个目录下

你需要吗?

你可以做的是使用 echo.Group 并将其传递给 api 包,然后在那里初始化路由处理程序。

package api

import (
    "github.com/labstack/echo"
)

func UseSubroute(group *echo.Group)  {
    group.GET("/", sayHello)
    group.GET("/music", getMusic)
    group.GET("/user/:id", getDetail)
    group.POST("/user", addUser)
}

主要是您可以导入 api 包。

package main

import (
    "github.com/labstack/echo"
    "your-repo/path-to/api" // your api package
)

func main() {
    e := echo.New()
    apiGroup := e.Group("/api")
    api.UseSubroute(apiGroup)
    // ...
}

根据@Andy的想法,我想出了一个解决方案,支持可分离的嵌套路由。

当前文件夹结构如下:

.
├── routes
│   ├── index.go
│   └── music.go
└── server.go

...其中server.go是项目主入口,属于main包,而index.gomusic.go属于routes包.

端点是

"/api"       -> index.go
"/api/music" -> music.go

首先在 index.go 中,我们定义了一个在此级别使用路由的函数。

func UseRoute(group *echo.Group, routes func(group *echo.Group)) {
    routes(group)
}

然后,

server.go

func main() {
    e := echo.New()
    apiGroup := e.Group("/api")
    routes.ActivateIndex(mainGroup)
}

index.go

var mainGroup *echo.Group
func ActivateIndex(g *echo.Group) {
    mainGroup = g
    UseRoute(mainGroup, IndexRoutes)

    // sub routes
    musicGroup := mainGroup.Group("/music")
    ActivateMusic(musicGroup)
}

并在 music.go

var musicGroup *echo.Group
func ActivateMusic(g *echo.Group) {
    musicGroup = g
    UseRoute(musicGroup, MusicRoutes)
}

注意:IndexRoutesMusicRoutes等是在该级别指定端点的函数。

例如

func IndexRoutes(group *echo.Group) {
    group.GET("/", sayHello)
    group.GET("/user/:id", getDetail)
    group.POST("/user", addUser)
}

这样可以将路由定义在不同的.go文件中,业务逻辑更加清晰。

例如,为了扩展嵌套级别,我们可以在hiphop.go中创建另一个ActivateHiphop函数,同时从[=20=中导入ActivateMusic函数中的新子路由], 这样 "/api/music/hiphop" 就可以指向 hiphop.go.

p.s。要在 /api 级别添加更多路由,只需在 IndexRoutes 函数中创建更多端点。