如何使用正则表达式匹配URL,它确实决定使用相应的函数处理
package main import( "fmt" "net/http" ) func main() { http.HandleFunc("/pattern", resolve) http.ListenAndServe(":8080", nil) } func resolve(w http.ResponseWriter, r * http.Request) { fmt.Println(r.URL.Host) }
http.HandleFunc()不能用于注册模式以匹配正则表达式。简而言之,在处指定的模式HandleFunc()可以匹配固定的,有根的路径(如/favico.ico)或有根的子树(如/images/),较长的模式优先于较短的模式。您可以在该ServeMux类型的文档中找到更多详细信息。
http.HandleFunc()
HandleFunc()
/favico.ico
/images/
ServeMux
您可以做的是将您的处理程序注册到一个有根的子树,该子树可能包含该/模式的所有内容,并且在您的处理程序内部,您可以进行进一步的正则表达式匹配和路由。
/
例如:
func main() { http.HandleFunc("/", route) // Match everything http.ListenAndServe(":8080", nil) } var rNum = regexp.MustCompile(`\d`) // Has digit(s) var rAbc = regexp.MustCompile(`abc`) // Contains "abc" func route(w http.ResponseWriter, r *http.Request) { switch { case rNum.MatchString(r.URL.Path): digits(w, r) case rAbc.MatchString(r.URL.Path): abc(w, r) default: w.Write([]byte("Unknown Pattern")) } } func digits(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Has digits")) } func abc(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Has abc")) }
或使用外部库(例如Gorilla MUX)。