1 回答

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
不總是。例如io.Reader
:
type Reader interface { Read(p []byte) (n int, err error)}Reader 是包裝基本 Read 方法的接口。
Read 將最多 len(p) 個(gè)字節(jié)讀入 p。它返回讀取的字節(jié)數(shù) (0 <= n <= len(p)) 和遇到的任何錯(cuò)誤。即使 Read 返回 n < len(p),它也可能在調(diào)用期間使用所有 p 作為暫存空間。如果某些數(shù)據(jù)可用但 len(p) 字節(jié)不可用,則 Read 通常會返回可用的數(shù)據(jù),而不是等待更多數(shù)據(jù)。
當(dāng) Read 在成功讀取 n > 0 個(gè)字節(jié)后遇到錯(cuò)誤或文件結(jié)束條件時(shí),它返回讀取的字節(jié)數(shù)。它可能會從同一個(gè)調(diào)用中返回(非零)錯(cuò)誤或從后續(xù)調(diào)用中返回錯(cuò)誤(和 n == 0)。這種一般情況的一個(gè)實(shí)例是,在輸入流末尾返回非零字節(jié)數(shù)的 Reader 可能返回 err == EOF 或 err == nil。下一個(gè) Read 應(yīng)該返回 0,EOF。
在考慮錯(cuò)誤 err 之前,調(diào)用者應(yīng)始終處理返回的 n > 0 個(gè)字節(jié)。這樣做可以正確處理讀取一些字節(jié)以及允許的 EOF 行為后發(fā)生的 I/O 錯(cuò)誤。
不鼓勵 Read 的實(shí)現(xiàn)返回帶有 nil 錯(cuò)誤的零字節(jié)計(jì)數(shù),除非 len(p) == 0。調(diào)用者應(yīng)該將返回 0 和 nil 視為表示沒有發(fā)生任何事情;特別是它不表示EOF。
實(shí)現(xiàn)不能保留 p。
例如,
readfile.go:
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("readfile.go")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
r := bufio.NewReader(f)
fileLen := int64(0)
buf := make([]byte, 0, 4*1024)
for {
n, err := r.Read(buf[:cap(buf)])
buf = buf[:n]
if n == 0 {
if err == nil {
continue
}
if err == io.EOF {
break
}
fmt.Println(err)
return
}
// Do something with buf
fileLen += int64(len(buf))
if err != nil && err != io.EOF {
fmt.Println(err)
return
}
}
fmt.Println("file length:", fileLen, "bytes")
}
如果是err != nil這樣,除非文檔另有說明,否則假定所有其他值都未定義。
- 1 回答
- 0 關(guān)注
- 259 瀏覽
添加回答
舉報(bào)