2016-01-04 13:48:38 +00:00
|
|
|
|
### 5.4.2. 文件結尾錯誤(EOF)
|
2016-01-02 14:12:38 +00:00
|
|
|
|
|
2016-01-18 03:22:04 +00:00
|
|
|
|
函數經常會返迴多種錯誤,這對終端用戶來説可能會很有趣,但對程序而言,這使得情況變得複雜。很多時候,程序必須根據錯誤類型,作出不同的響應。讓我們考慮這樣一個例子:從文件中讀取n個字節。如果n等於文件的長度,讀取過程的任何錯誤都表示失敗。如果n小於文件的長度,調用者會重複的讀取固定大小的數據直到文件結束。這會導致調用者必須分别處理由文件結束引起的各種錯誤。基於這樣的原因,io包保證任何由文件結束引起的讀取失敗都返迴同一個錯誤——io.EOF,該錯誤在io包中定義:
|
2016-01-06 01:39:11 +00:00
|
|
|
|
|
|
|
|
|
```Go
|
2016-01-05 15:46:55 +00:00
|
|
|
|
package io
|
2016-01-06 01:39:11 +00:00
|
|
|
|
|
2016-01-05 15:46:55 +00:00
|
|
|
|
import "errors"
|
2016-01-06 01:39:11 +00:00
|
|
|
|
|
2016-01-05 15:46:55 +00:00
|
|
|
|
// EOF is the error returned by Read when no more input is available.
|
|
|
|
|
var EOF = errors.New("EOF")
|
|
|
|
|
```
|
2016-01-06 01:39:11 +00:00
|
|
|
|
|
2016-01-05 15:46:55 +00:00
|
|
|
|
調用者隻需通過簡單的比較,就可以檢測出這個錯誤。下面的例子展示了如何從標準輸入中讀取字符,以及判斷文件結束。(4.3的chartcount程序展示了更加複雜的代碼)
|
2016-01-06 01:39:11 +00:00
|
|
|
|
|
|
|
|
|
```Go
|
2016-01-05 15:46:55 +00:00
|
|
|
|
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)
|
|
|
|
|
}
|
2016-01-06 01:39:11 +00:00
|
|
|
|
// ...use r…
|
2016-01-05 15:46:55 +00:00
|
|
|
|
}
|
|
|
|
|
```
|
2016-01-06 01:39:11 +00:00
|
|
|
|
|
2016-01-05 15:46:55 +00:00
|
|
|
|
因爲文件結束這種錯誤不需要更多的描述,所以io.EOF有固定的錯誤信息——“EOF”。對於其他錯誤,我們可能需要在錯誤信息中描述錯誤的類型和數量,這使得我們不能像io.EOF一樣采用固定的錯誤信息。在7.11節中,我們會提出更繫統的方法區分某些固定的錯誤值。
|