跨包共享gorilla / mux路由器

时间:2017-06-06 11:04:19

标签: go gorilla

我在使用gorilla / mux实现轻微的MVC设计时遇到了一些问题。

模块的布局如下:

main.go
-- controllers
---- base.controller.go
---- example.controller.go
-- models
---- base.model.go
---- example.controller.go

controllers中的所有文件都在controllers包中,与models相同,然后main.gomain包。

目前我只是想让Base Controller能够与正在运行的main package共享,尽管它在尝试实现路由时会抛出一些错误。构建不会抛出任何错误,但路由不可用。如果我在Gorilla / Mux文档中实现Walk函数打印出mux.Router的所有已注册路由,那么它会给我这个错误:

  

& {%!!(MISSING)s(* mux.Router =& {[0xc4200901b0] map [] true   false false false})%!!(MISSING)s(http.HandlerFunc = 0xc8df0)   [%!!(MISSING)s(* mux.routeRegexp =& {/ false false true false   0xc420095360 / [] []})]%!!(MISSING)s(* mux.routeRegexpGroup =& {   0xc420016240 []})%!!(MISSING)s(bool = true)%!!(MISSING)s(bool = false)   %!!(MISSING)s(bool = false)%!!(MISSING)s(bool = false)   %!!(MISSING)S(= mux.BuildVarsFunc)}

全局var V1Router *mux.Router的推理首先是在main package中访问它,并在其他控制器中创建子路由器。

我对Go相当新,但我正在努力学习最佳做法!任何帮助将不胜感激!

以下示例代码:

base.controllers.go

package controllers

import (
        "fmt"
        "bytes"
        "net/http"
        "github.com/gorilla/mux"
)

var V1Router *mux.Router

func init () {
    V1Router = mux.NewRouter()
    V1Router.StrictSlash(true)
    V1Router.HandleFunc("/", BaseHandler)    
}

// Base route to access the API Documentation.
func BaseHandler (w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, Gophers!")
}

main.go

package main

import (
    "net/http"
    "log"
    "github.com/projectrepo/project/models"
    "github.com/projectrepo/project/controllers"
    "github.com/gorilla/mux"
)

func main () {
    http.Handle("/v1", controllers.V1Router)
    if err := http.ListenAndServe(":8000", nil); err != nil {
        log.Fatal("Serving error.")
    }
}

在回应评论时,我尝试了同样的结果:

package main

import (
    "net/http"
    "log"
    "github.com/projectrepo/project/models"
    "github.com/projectrepo/project/controllers"
    "github.com/gorilla/mux"
)

func main () {
    r := mux.NewRouter()
    r.Handle("/v1", controllers.V1Router)
    if err := http.ListenAndServe(":8000", r); err != nil {
        log.Fatal("Serving error.")
    }
}

1 个答案:

答案 0 :(得分:1)

Gorilla mux.Router应该用于在一组预定义规则(例如主机,路径,协议,方案等)和它的处理程序({{1})之间创建映射。 }或http.Handler)。 Gorilla mux可用于替换标准服务器多路复用器。如果将http.HandlerFunc与内置的http服务器mux组合作为原始问题,即

gorilla/mux

当客户端访问func main () { http.Handle("/v1", controllers.V1Router) if err := http.ListenAndServe(":8000", nil); err != nil { log.Fatal("Serving error.") } } /v1时实际发生的情况将通过传递给controllers.V1Router的请求路径/v1进行调用。在V1Router1中,您定义controllers.V1Router将由/处理。但是,由于传入的请求路径为BaseHandler,因此它不会与您的路由表匹配。如果你想定义子路由,你可以这样做(这是我在第一个评论中的意思):

/v1

然后在控制器(func main () { r := mux.NewRouter() v1 := r.PathPrefix("/v1").Subrouter() controllers.RegisterHandlers(v1) if err := http.ListenAndServe(":8000", r); err != nil { log.Fatal("Serving error.") } } )中定义

base.controllers.go