如何从其他包导入子路由
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.go
和music.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)
}
注意:IndexRoutes
、MusicRoutes
等是在该级别指定端点的函数。
例如
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
函数中创建更多端点。
而不是在 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.go
和music.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)
}
注意:IndexRoutes
、MusicRoutes
等是在该级别指定端点的函数。
例如
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
函数中创建更多端点。