go - 如何组织 gorilla mux 路线?

标签 go gorilla

我正在使用 Gorilla Mux为了编写 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)

}

所以我想要做的是取出这个路由声明并将其拆分为多个文件,我将如何去做呢? 提前致谢。

最佳答案

您可以将您的路由器独立模块化成不同的包,并将它们安装在主路由器上

对以下 issue 稍作阐述,您可以想出这种方法,使其具有很强的可扩展性(并且在某种程度上更易于测试)

/api/router.go

package api

import (
    "net/http"

    "github.com/gorilla/mux"
)

func Router() *mux.Router {
    router := mux.NewRouter()
    router.HandleFunc("/", home)
    return router
}

func home(w http.ResponseWriter, req *http.Request) {
    w.Write([]byte("hello from API"))
}

/main.go

package main

import (
    "log"
    "net/http"
    "strings"

    "github.com/...yourPath.../api"
    "github.com/...yourPath.../user"
    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()

    router.HandleFunc("/", home)
    mount(router, "/api", api.Router())
    mount(router, "/user", user.Router())

    log.Fatal(http.ListenAndServe(":8080", router))
}

func mount(r *mux.Router, path string, handler http.Handler) {
    r.PathPrefix(path).Handler(
        http.StripPrefix(
            strings.TrimSuffix(path, "/"),
            handler,
        ),
    )
}

func home(w http.ResponseWriter, req *http.Request) {
    w.Write([]byte("Home"))
}

关于go - 如何组织 gorilla mux 路线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548039/

相关文章:

go - Go标准库中是否有一个函数可以将缓冲区编码为go中的任何图像格式

session - Gorilla session 包混淆

go - 将上下文从 Web 请求的 Controller 传递到数据库层

for-loop - 如何在 Golang 中迭代结构中的 slice 或者是否可以在结构中使用 for 循环?

go - 如何使用 GOPATH 设置(或存储)Go 项目

golang 2 go例程如果一个终止终止另一个

当 SessionStore 来自导出包时未设置 Gorilla/sessions cookie

regex - gorilla Mux 正则表达式

go - 当没有路由与 Gorilla 匹配时提供文件?

go - 我如何在 golang 的 UDP 服务器上获取客户端 ip 地址?