首頁  >  文章  >  後端開發  >  如何在 Go 的 net/http 套件中取消註冊處理程序?

如何在 Go 的 net/http 套件中取消註冊處理程序?

DDD
DDD原創
2024-11-05 15:08:02426瀏覽

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 取消註冊處理程序可以從另一個goroutine 安全地完成,不會影響ListenAndServe() 的訊息路由。

以上是如何在 Go 的 net/http 套件中取消註冊處理程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn