在 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, &handler) } func main() { factory := HandlerFactory{0} http.Handle("/create", &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", &factory) srv := &http.Server { Addr: localhost:8080 Handler: mux, } srv.ListenAndServe()</code>
从此自定义 ServerMux 取消注册处理程序可以从另一个 goroutine 安全地完成,不会影响 ListenAndServe() 的消息路由。
以上是如何在 Go 的 net/http 包中取消注册处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!