gopl-zh.github.com/ch5/ch5-04-2.md

31 lines
1.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### 5.4.2. 文件結尾錯誤EOF
函數經常會返迴多種錯誤這對終端用戶來説可能會很有趣但對程序而言這使得情況變得複雜。很多時候程序必須根據錯誤類型作出不同的響應。讓我們考慮這樣一個例子從文件中讀取n個字節。如果n等於文件的長度讀取過程的任何錯誤都表示失敗。如果n小於文件的長度調用者會重複的讀取固定大小的數據直到文件結束。這會導致調用者必須分别處理由文件結束引起的各種錯誤。基於這樣的原因io包保證任何由文件結束引起的讀取失敗都返迴同一個錯誤——io.EOF該錯誤在io包中定義
```Go
package io
import "errors"
// EOF is the error returned by Read when no more input is available.
var EOF = errors.New("EOF")
```
調用者隻需通過簡單的比較就可以檢測出這個錯誤。下面的例子展示了如何從標準輸入中讀取字符以及判斷文件結束。4.3的chartcount程序展示了更加複雜的代碼
```Go
in := bufio.NewReader(os.Stdin)
for {
r, _, err := in.ReadRune()
if err == io.EOF {
break // finished reading
}
if err != nil {
return fmt.Errorf("read failed:%v", err)
}
// ...use r…
}
```
因爲文件結束這種錯誤不需要更多的描述所以io.EOF有固定的錯誤信息——“EOF”。對於其他錯誤我們可能需要在錯誤信息中描述錯誤的類型和數量這使得我們不能像io.EOF一樣采用固定的錯誤信息。在7.11節中,我們會提出更繫統的方法區分某些固定的錯誤值。