首頁 >後端開發 >Golang >為什麼 My Go Web 伺服器的呼叫計數僅顯示奇數?

為什麼 My Go Web 伺服器的呼叫計數僅顯示奇數?

Linda Hamilton
Linda Hamilton原創
2024-12-23 04:31:10509瀏覽

Why Does My Go Web Server's Call Count Show Only Odd Numbers?

為什麼Web 伺服器的呼叫計數會跳過偶數

問題

當使用此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中文網其他相關文章!

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