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

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

DDD
DDDオリジナル
2024-11-05 15:08:02427ブラウズ

How to Unregister Handlers in Go's `net/http` Package?

net/http でのハンドラーの登録解除

net/http では、実行時にハンドラーを登録および登録解除できます。これにより、Web サーバーの動的な構成が可能になります。

ハンドラーの登録

次のコードは、HandlerFactory を使用して実行時にハンドラーを登録する方法を示しています。

<code class="go">package main

import (
    "fmt"
    "net/http"
)

type MyHandler struct {
    id int
}

func (hf *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, r.URL.Path)
}

// Creates MyHandler instances and registers them as handlers at runtime
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, &amp;handler)
}

func main() {
    factory := HandlerFactory{0}
    http.Handle("/create", &amp;factory)
    http.ListenAndServe("localhost:8080", nil)
}</code>

ハンドラーの登録解除

ハンドラーの登録を解除するには、カスタム ServerMux を作成して使用できます。このカスタム ServerMux には、パターンからハンドラーへのマッピングをマップから削除する Deregister メソッドが含まれています:

<code class="go">// TODO: check if registered and return error if not.
// TODO: possibly remove the automatic permanent link between /dir and /dir/.
func (mux *MyMux) Deregister(pattern string) error {
    mux.mu.Lock()
    defer mux.mu.Unlock()
    del(mux.m, pattern)
    return nil
}</code>

このカスタム ServerMux の使用:

<code class="go">mux := newMux()
mux.Handle("/create", &amp;factory)

srv := &amp;http.Server {
    Addr: localhost:8080
    Handler: mux,
}
srv.ListenAndServe()</code>

このカスタム ServerMux からハンドラーの登録を解除すると、 ListenAndServe() によるメッセージのルーティングに影響を与えることなく、別の goroutine から安全に実行できます。

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

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