2 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
之所以出現(xiàn)這種情況的原因是因為你的HandlerFunc其稱之為“l(fā)oadPage”與請求同步調(diào)用。當您在 go 例程中調(diào)用它時,處理程序?qū)嶋H上是立即返回,從而立即發(fā)送響應。這就是為什么你會得到一個空白頁。
您可以在server.go 中看到這一點(第 1096 行):
serverHandler{c.server}.ServeHTTP(w, w.req)
if c.hijacked() {
return
}
w.finishRequest()
該ServeHTTP函數(shù)調(diào)用您的處理程序,并在返回后立即調(diào)用“finishRequest”。因此,只要您的 Handler 函數(shù)想要滿足請求,它就必須阻塞。
使用 go 例程實際上不會使您的頁面更快。正如 Philip 建議的那樣,將單個 go 例程與通道同步,在這種情況下也無濟于事,因為這與根本沒有 go 例程相同。
您的問題的根源實際上是ioutil.ReadFile,它在發(fā)送之前將整個文件緩沖到內(nèi)存中。
如果要流式傳輸文件,則需要使用os.Open. 您可以使用io.Copy將文件內(nèi)容流式傳輸?shù)綖g覽器,瀏覽器將使用分塊編碼。
這看起來像這樣:
f, err := os.Open(path)
if err != nil {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
n, err := io.Copy(w, f)
if n == 0 && err != nil {
http.Error(w, "Error", http.StatusInternalServerError)
return
}
如果由于某種原因您需要在多個 go 例程中工作,請查看sync.WaitGroup. 渠道也可以工作。
如果您只想提供一個文件,則還有其他為此進行了優(yōu)化的選項,例如FileServer或ServeFile。
- 2 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報