Go 的HTTP 處理程序中的多個WriteHeader 呼叫
在一個具有net/http 伺服器的簡單Go 程式中,開發人員遇到「多重回應」嘗試處理HTTP 請求時出現「.WriteHeader 呼叫」錯誤。當程式合併 goroutine 來執行 HandleIndex 函數時,就會發生錯誤,儘管處理程序函數被設計為只編寫一次標頭並提供靜態主體。
錯誤說明
負責處理傳入請求的匿名函數列印 URL,在新的 goroutine 中啟動 HandleIndex 函數,然後繼續執行。當處理函數在首次呼叫 Write 之前省略設定回應狀態時,Go 會自動將狀態設為 200 (HTTP OK)。此外,如果處理函數沒有向回應寫入任何內容(並且沒有設定回應狀態並正常完成),則這將被視為成功的請求處理,導致回應狀態為 200。
在這種情況下,匿名函數不會設定回應狀態,也不會將任何內容寫入回應。因此,Go 將回應狀態設定為 200 HTTP OK。由於每個請求都是在自己的 goroutine 中處理的,因此如果在新的 goroutine 中呼叫 HandleIndex,原來的匿名函數將繼續執行,包括設定回應頭。同時,新啟動的goroutine也會設定response header,導致「多次response.WriteHeader requests」錯誤。
解決方案:刪除Goroutine
透過消除「go」關鍵字,HandleIndex 將在與處理函數相同的goroutine 中調用,確保在處理函數返回之前設置響應頭。這可以防止“net/http”套件再次嘗試設定回應標頭,從而解決錯誤。
以上是為什麼使用 Goroutines 會導致 Go 的 HTTP 處理程序中出現「多次 response.WriteHeader 呼叫」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!