亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

io.LimitReader 讀取 http.Body 時的 EOF

io.LimitReader 讀取 http.Body 時的 EOF

Go
飲歌長嘯 2022-06-13 10:55:26
這對某人來說可能很明顯,但我需要一些幫助來看看我哪里出錯了。我試圖通過使用 io.LimitReader 來限制我從 http.Response.Body 讀取的數據。我正在直接讀取 [] 字節。但是,當我嘗試這樣做時,我得到了一個 EOF。下面是代碼的模型。resp, err := http.Client.Do(req)if err != nil {    return nil, err}defer resp.Body.Close()lr := io.LimitReader(resp.Body, 1e+6)b := make([]byte, 1e+6)_, err := lmtdR.Read(b)if err != nil {    return nil, err}以上失敗。但是,如果我這樣做......resp, err := http.Client.Do(req)if err != nil {    return nil, err}defer resp.Body.Close()lr := io.LimitReader(resp.Body, 1e+6)bdy, err := ioutil.ReadAll(lr)if err != nil {    return nil, err}這行得通。所以我有一個解決方案,但我真的想知道在我給出的第一個例子中我做錯了什么。任何幫助,將不勝感激。
查看完整描述

2 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

總是從文檔開始。


區別在于語義:


io.Reader.Read:


~$ go doc io.Reader


package io // import "io"


type Reader interface {

    Read(p []byte) (n int, err error)

}

Reader是包裝基本Read方法的接口。


Read最多將len(p)字節讀入p. 它返回讀取的字節數 ( 0 <= n <= len(p)) 和遇到的任何錯誤。即使Read返回n < len(p),它也可能在調用期間使用所有p作為暫存空間。如果某些數據可用但len(p)字節不可用,Read 通常會返回可用的數據,而不是等待更多數據。


當Read成功讀取字節后遇到錯誤或文件結束條件時n > 0,它返回讀取的字節數。它可能會從同一次調用中返回(非零)錯誤,或者n == 0從后續調用中返回錯誤(和)。這種一般情況的一個例子是,Reader在輸入流的末尾返回非零字節數可能會返回 err == EOF或err == nil。下一個Read應該返回0, EOF。


io/ioutil.ReadAll:


~$ go doc ioutil.ReadAll


package ioutil // import "io/ioutil"


func ReadAll(r io.Reader) ([]byte, error)

ReadAll讀取r直到出現錯誤或EOF返回它讀取的數據。一個成功的調用返回err == nil,而不是err == EOF。因為ReadAll定義為從 src 讀取 until EOF,所以它不會將EOFfromRead視為要報告的錯誤。


查看完整回答
反對 回復 2022-06-13
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

引用以下文檔Reader.Read()

Read最多將 len(p) 個字節讀入 p。

Read()即使源中有足夠的數據,也不能保證會填充傳遞的切片。實現可以自由地讀取更少的字節并“提前”返回,通常如果讀取更多會阻塞。如果有任何機會Read()從其源讀取“所有內容”,它可能會返回 EOF 以表示無法讀取更多數據。這就是你所經歷的。

ioutil.ReadAll()另一方面保證它繼續閱讀或等待,直到閱讀器返回錯誤或報告 EOF。另請注意,如果源閱讀器被讀取到 EOF,ioutil.ReadAll()則不會返回 EOF 而是nil錯誤,因為在ReadAll().


查看完整回答
反對 回復 2022-06-13
  • 2 回答
  • 0 關注
  • 300 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號