我在使用gorilla / mux实现轻微的MVC设计时遇到了一些问题。
模块的布局如下:
main.go
-- controllers
---- base.controller.go
---- example.controller.go
-- models
---- base.model.go
---- example.controller.go
controllers
中的所有文件都在controllers
包中,与models
相同,然后main.go
是main
包。
目前我只是想让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.")
}
}
答案 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