package main
import "fmt"
import "net/http"
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "What!")
}
func bar(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Bar!")
}
func main() {
http.HandleFunc("/", home)
http.HandleFunc("/foo", bar)
http.ListenAndServe(":5678", nil)
}
如果我访问/foo
,bar
将会运行。
如果我访问/
或/any/other/path
,home
将会运行。
知道为什么会这样吗?我该如何处理404?
答案 0 :(得分:3)
这是设计行为 - 为以/
结尾的路径定义的处理程序也将处理任何子路径。
请注意,由于以斜杠结尾的模式命名为带根子树,因此模式“/”匹配所有与其他已注册模式不匹配的路径,而不仅仅是带有Path ==“/".
的URL
http://golang.org/pkg/net/http/#ServeMux
您必须为404实现自己的逻辑。请考虑golang doc中的以下示例:
mux := http.NewServeMux()
mux.Handle("/api/", apiHandler{})
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
// The "/" pattern matches everything, so we need to check
// that we're at the root here.
if req.URL.Path != "/" {
http.NotFound(w, req)
return
}
fmt.Fprintf(w, "Welcome to the home page!")
})
答案 1 :(得分:2)
您必须在home
处理自己的404。