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視為要報告的錯誤。

TA貢獻1853條經驗 獲得超6個贊
引用以下文檔Reader.Read()
:
Read最多將 len(p) 個字節讀入 p。
Read()
即使源中有足夠的數據,也不能保證會填充傳遞的切片。實現可以自由地讀取更少的字節并“提前”返回,通常如果讀取更多會阻塞。如果有任何機會Read()
從其源讀取“所有內容”,它可能會返回 EOF 以表示無法讀取更多數據。這就是你所經歷的。
ioutil.ReadAll()
另一方面保證它繼續閱讀或等待,直到閱讀器返回錯誤或報告 EOF。另請注意,如果源閱讀器被讀取到 EOF,ioutil.ReadAll()
則不會返回 EOF 而是nil
錯誤,因為在ReadAll()
.
- 2 回答
- 0 關注
- 300 瀏覽
添加回答
舉報