ホームページ  >  記事  >  バックエンド開発  >  Go の net/http パッケージで HTTP ハンドラーを動的に登録および登録解除するにはどうすればよいですか?

Go の net/http パッケージで HTTP ハンドラーを動的に登録および登録解除するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-05 12:50:02135ブラウズ

How can you dynamically register and unregister HTTP handlers in Go's net/http package?

net/http での動的ハンドラーの登録と登録解除の処理

net/http で、ランタイムに登録されたハンドラーを処理するには、カスタム アプローチが必要です。 HTTP サーバーはハンドラーを登録するためのメカニズムを提供しますが、ハンドラーを動的に登録解除する機能がありません。

カスタム ハンドラー登録の実装

ハンドラーを動的に作成および登録するには、カスタム HandlerFactory を使用できます。これは、一意の ID を持つ新しいハンドラーを生成し、http.Handle を使用して登録するように設計できます。たとえば、「/create」ハンドラーは、ID を増加させて MyHandler インスタンスを生成し、特定の URL パターンにマップできます。

<code class="go">type HandlerFactory struct {
    handler_id int
}

func (hf *HandlerFactory) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    hf.handler_id++
    handler := MyHandler{hf.handler_id}
    handle := fmt.Sprintf("/%d/", hf.handler_id)
    http.Handle(handle, &handler)
}</code>

ハンドラーの登録解除

未登録のハンドラーを提供するには、以下が必要です。元の ServeMux を拡張し、登録解除メソッドを含むカスタム ServerMux を作成します。

<code class="go">type MyMux struct {
    http.ServeMux
    mu sync.Mutex
}

func (mux *MyMux) Deregister(pattern string) error {
    mux.mu.Lock()
    defer mux.mu.Unlock()
    del(mux.m, pattern)

    // Handle additional error checking or setup here
}</code>

カスタマイズ可能な Web サーバーの実装

このカスタム ServerMux を使用するには、新しい ServerMux をインスタンス化してラップします。 http.Handler:

<code class="go">mux := new(MyMux)
mux.Handle("/create", &factory)

srv := &http.Server{
    Addr:    "localhost:8080",
    Handler: mux,
}

go srv.ListenAndServe()

// Deregister handlers as needed
mux.Deregister("/123/*")</code>

を使用して HTTP サーバー内でこれを実行すると、ハンドラーを動的に登録および登録解除できるため、ランタイムで生成された URL パターンの処理に必要な柔軟性が得られます。

以上がGo の net/http パッケージで HTTP ハンドラーを動的に登録および登録解除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。