http.HandleFunc または http.Handler でハンドラーを登録する場合、複数のパスに一致するように URL パターンでワイルドカードを指定することが望ましい。たとえば、/groups/*/people のようなすべてのリクエストに対してハンドラーを定義したい場合があります。
残念ながら、Go の HTTP ハンドラーのデフォルトのパターン マッチングではワイルドカードがサポートされていません。パターンは正規表現やグロブではなく、ワイルドカード パスを表現する組み込みの方法はありません。
1 つの解決策は、より複雑なパターンに一致する正規表現を使用するカスタム ハンドラー関数を生成することです。正規表現をサポートするカスタム ハンドラーの例を次に示します。
import ( "net/http" "regexp" ) type RegexpHandler struct { routes []*route } type route struct { pattern *regexp.Regexp handler http.Handler } 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) }
このカスタム ハンドラーを使用すると、正規表現パターンを定義し、それをハンドラー関数に関連付けることができます。リクエストが受信されると、ハンドラーはリクエストのパスをパターンと照合してチェックし、一致するものが見つかった場合は関連付けられたハンドラーにディスパッチします。
このアプローチでは柔軟性が高まりますが、追加の開発作業が必要となり、依存関係が生じます。正規表現。それにもかかわらず、これは http.HandleFunc との複雑な URL パターン マッチングの実行可能なオプションです。
以上がGo の HTTP ハンドラーで URL パターンのワイルドカード マッチングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。