當使用此Go Web 伺服器來計算其呼叫次數時,它會呼叫次數時,它會呼叫次數列印奇數數字預期序列1, 2, 3...:
package mainimport ( "fmt" "net/http" ) var calls int // HelloWorld print the times being called. func HelloWorld(w http.ResponseWriter, r *http.Request){ calls++ fmt.Fprintf(w, "You've called me %d times", calls) } func main() { fmt.Printf("Started server at http://localhost%v.\n", 5000) http.HandleFunc("/", HelloWorld) http.ListenAndServe(":5000", nil) }
觀察到的行為是由於瀏覽器對 favicon.ico 檔案的處理造成的。當載入網頁時,瀏覽器會請求該文件,這是一個標準的網站圖示。由於給定程式碼提供的 Web 伺服器不提供有效的 favicon.ico,因此瀏覽器會重複要求它。
由於每個請求都算作 HelloWorld 處理程序的調用,因此即使用戶僅刷新頁面一次。 favicon.ico 請求夾在 HelloWorld 函數處理的根 URL(「/」)呼叫之間,導致數字序列不均勻。
為了防止這種情況,可以檢查HelloWorld 中的請求路徑函數並忽略對favicon.ico 的請求:
func HelloWorld(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { return } count := atomic.AddInt64(&calls, 1) fmt.Fprintf(w, "You've called me %d times", count) }
此修改可確保僅針對根URL 的請求,呼叫計數才會增加。或者,可以在 Web 伺服器設定中完全停用 favicon.ico 請求。
以上是為什麼 My Go Web 伺服器的呼叫計數僅顯示奇數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!