HttpHandler 的意外雙重呼叫:HandleFunc
概述Web 伺服器中的多工器,觀察到註冊的處理程序對於從Web 瀏覽器發出的每個請求,函數 (HandleFunc) 都會被呼叫兩次。此行為與預期功能相反。
問題
在使用可遞增計數器的處理程序函數實作基本 Web 伺服器時,可以觀察到計數器會遞增每個瀏覽器請求兩次。然而,當使用curl時,處理程序只會按預期被呼叫一次。
原因
記錄請求後,很明顯瀏覽器也發送了一個請求/favicon.ico。這是對通常顯示在瀏覽器網址列或選項卡中的小圖示的請求。由於 ServeMux 多工器預設會匹配所有 URL,因此它會為此附加請求呼叫已註冊的處理程序,從而導致雙重呼叫。
解決方案
防止處理程序為favicon.ico 請求呼叫時,可以用兩種方法考慮:
func favicon(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "favicon.ico") } func main() { mux := http.NewServeMux() mux.HandleFunc("/", hello) mux.HandleFunc("/favicon.ico", favicon) http.ListenAndServe(":8000", mux) }
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { hello(w, r) } })
以上是為什麼在使用網頁瀏覽器時我的 Go `HandleFunc` 被呼叫兩次?的詳細內容。更多資訊請關注PHP中文網其他相關文章!