Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gorilla/mux嵌套路由不匹配_Go_Routes_Mux - Fatal编程技术网

gorilla/mux嵌套路由不匹配

gorilla/mux嵌套路由不匹配,go,routes,mux,Go,Routes,Mux,我不知道为什么我的路线不匹配localhost:8000匹配,我得到了预期的输出,但不是localhost:8000/admin/test。当我尝试在浏览器上匹配/admin/test时,我得到了404 我希望以这种方式组织代码,因为我希望在每个包中包含路由和其他子例程 项目结构 /admin admin.go main.go 梅因,加油 package main import ( "example.com/liondancer/playground/admin&quo

我不知道为什么我的路线不匹配
localhost:8000
匹配,我得到了预期的输出,但不是
localhost:8000/admin/test
。当我尝试在浏览器上匹配
/admin/test
时,我得到了
404

我希望以这种方式组织代码,因为我希望在每个
包中包含路由和其他子例程

项目结构

/admin
  admin.go
main.go
梅因,加油

package main

import (
    "example.com/liondancer/playground/admin"
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there!")
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", handler)
    r.PathPrefix("/admin").Handler(admin.NewHandler())
    log.Fatal(http.ListenAndServe(":8000", r))
}
管理员,开始

package admin

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

type Handler struct {
    router *mux.Router
}

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    h.router.ServeHTTP(w, r)
}

func NewHandler() *Handler {
    h := &Handler{}
    r := mux.NewRouter()
    h.router = r
    h.addRoutes()
    return h
}

func (h *Handler) addRoutes() {
    fmt.Print("hi here"). // <--- printed here to prove func gets ran.
    h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintf(w, "test")
    })
}
包管理
进口(
“fmt”
“net/http”
“github.com/gorilla/mux”
)
类型处理程序结构{
路由器*mux.router
}
func(h*Handler)ServeHTTP(w http.ResponseWriter,r*http.Request){
h、 路由器服务TTP(w,r)
}
func NewHandler()*处理程序{
h:=&处理程序{}
r:=mux.NewRouter()
h、 路由器=r
h、 addRoutes()
返回h
}
func(h*处理程序)addRoutes(){

fmt.Print(“hi here”)。//我能够使用
子计算机()运行此代码。
下面是一个
Subrouter()
用法示例的链接

如果要将其分离到另一个文件中,也可以这样做:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", handler)
    subRoute := r.PathPrefix("/admin").Subrouter()
    NewHandler(subRoute)
    log.Fatal(http.ListenAndServe(":8000", r))
}

func NewHandler(r* mux.Router) *Handler {
    h := &Handler{}
    h.router = r
    h.AddRoutes()
    return h
}

func (h *Handler) AddRoutes() {
    fmt.Print("hi here") // <--- printed here to prove func gets ran.
        h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintf(w, "test")
    })
}
func main(){
r:=mux.NewRouter()
r、 HandleFunc(“/”,handler)
子例程:=r.PathPrefix(“/admin”).Subcuter()
NewHandler(子例程)
log.Fatal(http.ListenAndServe(“:8000”,r))
}
func NewHandler(r*mux.Router)*处理程序{
h:=&处理程序{}
h、 路由器=r
h、 AddRoutes()
返回h
}
func(h*处理程序)AddRoutes(){

fmt.Print(“hi here”)/我能够使用
子计算机()运行此代码。
下面是一个
Subrouter()
用法示例的链接

如果要将其分离到另一个文件中,也可以这样做:

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", handler)
    subRoute := r.PathPrefix("/admin").Subrouter()
    NewHandler(subRoute)
    log.Fatal(http.ListenAndServe(":8000", r))
}

func NewHandler(r* mux.Router) *Handler {
    h := &Handler{}
    h.router = r
    h.AddRoutes()
    return h
}

func (h *Handler) AddRoutes() {
    fmt.Print("hi here") // <--- printed here to prove func gets ran.
        h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintf(w, "test")
    })
}
func main(){
r:=mux.NewRouter()
r、 HandleFunc(“/”,handler)
子例程:=r.PathPrefix(“/admin”).Subcuter()
NewHandler(子例程)
log.Fatal(http.ListenAndServe(“:8000”,r))
}
func NewHandler(r*mux.Router)*处理程序{
h:=&处理程序{}
h、 路由器=r
h、 AddRoutes()
返回h
}
func(h*处理程序)AddRoutes(){

fmt.Print(“hi here”)//您的嵌套处理程序从不匹配,因为您没有删除前面处理程序的URL前缀。 一个快速解决方案来说明我的意思:

// h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {

// quick fix
h.router.HandleFunc("/admin/test", func(w http.ResponseWriter, r *http.Request) {
显然,您希望嵌套的处理程序不知道它是如何嵌套的,因此在注册子处理程序时,去掉URL前缀,以便子处理程序匹配:

// r.PathPrefix("/admin").Handler(admin.NewHandler())

// better
r.PathPrefix("/admin/").Handler(
    http.StripPrefix(
        "/admin",
        admin.NewHandler(),
    ),
)

您的嵌套处理程序从不匹配,因为您没有删除先前处理程序的URL前缀。 一个快速解决方案来说明我的意思:

// h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {

// quick fix
h.router.HandleFunc("/admin/test", func(w http.ResponseWriter, r *http.Request) {
显然,您希望嵌套的处理程序不知道它是如何嵌套的,因此在注册子处理程序时,去掉URL前缀,以便子处理程序匹配:

// r.PathPrefix("/admin").Handler(admin.NewHandler())

// better
r.PathPrefix("/admin/").Handler(
    http.StripPrefix(
        "/admin",
        admin.NewHandler(),
    ),
)