1. ホーム
  2. regex

[解決済み] http.HandleFuncのパターンにおけるワイルドカードについて

2023-05-19 01:46:46

質問

Go (言語) でハンドラを登録する際、パターンにワイルドカードを指定する方法はありますか?

例えば

http.HandleFunc("/groups/*/people", peopleInGroupHandler)

ここで * は任意の有効なURL文字列である可能性があります。 あるいは、唯一の解決策は /groups にマッチさせ、残りはハンドラの中で考えるしかないのでしょうか ( peopleInGroupHandler )関数の中で残りの部分を把握するのですか?

どのように解決するのですか?

http.Handler と http.HandleFunc のパターンは、正規表現でもグロブでもありません。ワイルドカードを指定する方法はありません。これらは文書化されています。 を参照してください。 .

とはいえ、正規表現や他の種類のパターンを使用できる独自のハンドラを作成することはそれほど難しくありません。以下に正規表現を使用したものを示します (コンパイル済み、ただし未テスト)。

type route struct {
    pattern *regexp.Regexp
    handler http.Handler
}

type RegexpHandler struct {
    routes []*route
}

func (h *RegexpHandler) Handler(pattern *regexp.Regexp, handler http.Handler) {
    h.routes = append(h.routes, &route{pattern, handler})
}

func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp, handler func(http.ResponseWriter, *http.Request)) {
    h.routes = append(h.routes, &route{pattern, http.HandlerFunc(handler)})
}

func (h *RegexpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    for _, route := range h.routes {
        if route.pattern.MatchString(r.URL.Path) {
            route.handler.ServeHTTP(w, r)
            return
        }
    }
    // no pattern matched; send 404 response
    http.NotFound(w, r)
}