Go 如何组织大猩猩mux线路?

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

我正在使用编写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.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)