一尘不染

如何在Golang中使用regexp get url模式?

go

如何使用正则表达式匹配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)
}

阅读 283

收藏
2020-07-02

共1个答案

一尘不染

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)。

2020-07-02