Go 如何组织大猩猩mux线路?
我正在使用编写REST API,但在组织路由时遇到问题,目前我所有的路由都是在Go 如何组织大猩猩mux线路?,go,gorilla,Go,Gorilla,我正在使用编写REST API,但在组织路由时遇到问题,目前我所有的路由都是在main.go文件中定义的,如下所示 //main.go package main import ( "NovAPI/routes" "fmt" "github.com/gorilla/mux" "net/http" ) func main() { router := mux.NewRouter().StrictSlash(true) router.HandleF
main.go
文件中定义的,如下所示
//main.go
package main
import (
"NovAPI/routes"
"fmt"
"github.com/gorilla/mux"
"net/http"
)
func main() {
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/hello", func(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "Hello")
})
router.HandleFunc("/user", func(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "User")
})
router.HandleFunc("/route2", func(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "Route2")
})
router.HandleFunc("/route3", func(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "Route3")
})
// route declarations continue like this
http.ListenAndServe(":1128", router)
}
所以我想做的是取出这个路由声明并将其拆分成多个文件,我该如何做呢提前谢谢。像这样的东西怎么样
//main.go
package main
import (
"NovAPI/routes"
"fmt"
"github.com/gorilla/mux"
"net/http"
)
func main() {
router := mux.NewRouter().StrictSlash(true)
router.HandleFunc("/hello", HelloHandler)
router.HandleFunc("/user", UserHandler)
router.HandleFunc("/route2", Route2Handler)
router.HandleFunc("/route3", Route3Handler)
// route declarations continue like this
http.ListenAndServe(":1128", router)
}
func HelloHandler(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "Hello")
}
func UserHandler(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "User")
}
func Route2Handler(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "Route2")
}
func Route3Handler(res http.ResponseWriter, req *http.Request) {
fmt.Fprintln(res, "Route3")
}
这样,您就可以将处理程序放在其他文件甚至其他包中
如果您以附加依赖项(如数据库)结束,甚至可以使用构造函数技巧避免全局变量的需要:
//main.go
func main() {
db := sql.Open(…)
//...
router.HandleFunc("/hello", NewHelloHandler(db))
//...
}
func NewHelloHandler(db *sql.DB) func(http.ResponseWriter, *http.Request) {
return func(res http.ResponseWriter, req *http.Request) {
// db is in the local scope, and you can even inject it to test your
// handler
fmt.Fprintln(res, "Hello")
}
}
我喜欢查看github中的其他项目,了解如何做事情,对于这些情况,我通常先看一下。他们就是这样做的: 对于的路由,请在中定义所有处理程序,然后在中的NewRouter函数上初始化这些路由 请注意,systemRouter实现该接口,Routes函数返回一个[]router.Route,它们的处理程序定义为
func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error
代替Go的标准http处理程序:
func(w http.ResponseWriter, r *http.Request)
因此,他们有额外的代码在函数中将Docker API处理程序转换为Go HTTP处理程序
最后,为了将这些路由添加到他们的mux路由器中,他们在其处理器上实现了几个其他功能
如果你认为这是你正在寻找的东西,那么花点时间分析他们路线的Docker代码,如果你需要我详细说明,或者如果我遗漏了什么,请发表评论 您可以将路由器独立地模块化为不同的包,并将它们安装在主路由器上 只要对以下内容稍加阐述,您就可以提出这种方法,这使得它具有相当的可扩展性(并且在某种程度上更易于测试) /api/router.go
包api
进口(
“net/http”
“github.com/gorilla/mux”
)
func Router()*mux.Router{
路由器:=mux.NewRouter()
路由器.HandleFunc(“/”,主页)
返回路由器
}
func home(带http.ResponseWriter,req*http.Request){
w、 写入([]字节(“来自API的你好”))
}
/梅因,加油
主程序包
进口(
“日志”
“net/http”
“字符串”
“github.com/…yourPath…/api”
“github.com/…yourPath…/user”
“github.com/gorilla/mux”
)
func main(){
路由器:=mux.NewRouter()
路由器.HandleFunc(“/”,主页)
挂载(路由器,“/api”,api.router())
挂载(路由器,“/user”,user.router())
log.Fatal(http.ListenAndServe(“:8080”,路由器))
}
func挂载(r*mux.Router,路径字符串,处理程序http.handler){
r、 路径前缀(path).Handler(
http.StripPrefix(
strings.TrimSuffix(路径“/”,
handler,
),
)
}
func home(带http.ResponseWriter,req*http.Request){
w、 写入([]字节(“主”))
}
为了简单起见,我这样做了,但我的处理程序实际上是在routes包中定义的,因此我仍然需要将routes从主函数中删除。我不明白这一点:无论哪种方式,您仍然要在某个地方编写路由…如果“main”太长,也许您可以编写一个NewRouter
帮助程序来为您初始化它。另一个解决方案是在路由包中有一个初始化函数,它将路由器作为输入,并根据需要添加路由。但我强烈建议不要这样做。
func(w http.ResponseWriter, r *http.Request)