http.HandleFunc()
can not be used to register a pattern to match a regular expression. In short, the pattern specified at HandleFunc()
can match a fixed, rooted path (like /favico.ico
) or rooted subtrees (like /images/
), longer patterns take precedence over shorter ones. You can find more details at the doc of the ServeMux
type.
What you can do is register your handler to a rooted subtree which may be everything with the /
pattern, and inside your handler you can do further regexp matching and routing.
For example:
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"))
}
Or use an external library like Gorilla MUX.