# 11.8 第二個例子:讀和寫
讀和寫是軟件中很普遍的行爲,提起它們會立即想到讀寫文件、緩存(比如字節或字符串切片)、標準輸入輸出、標準錯誤以及網絡連接、管道等等,或者讀寫我們的自定義類型。爲了讓代碼儘可能通用,Go 採取了一致的方式來讀寫數據。
io
包提供了用於讀和寫的接口 io.Reader
和 io.Writer
:
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
只要類型實現了讀寫接口,提供 Read()
和 Write
方法,就可以從它讀取數據,或向它寫入數據。一個對象要是可讀的,它必須實現 io.Reader
接口,這個接口只有一個簽名是 Read(p []byte) (n int, err error)
的方法,它從調用它的對象上讀取數據,並把讀到的數據放入參數中的字節切片中,然後返回讀取的字節數和一個 error
對象,如果沒有錯誤發生返回 'nil',如果已經到達輸入的尾端,會返回 io.EOF("EOF")
,如果讀取的過程中發生了錯誤,就會返回具體的錯誤信息。類似地,一個對象要是可寫的,它必須實現 io.Writer
接口,這個接口也只有一個簽名是 Write(p []byte) (n int, err error)
的方法,它將指定字節切片中的數據寫入調用它的對象裏,然後返回實際寫入的字節數一個 error
對象(如果沒有錯誤發生就是 nil
)。
io
包裏的 Readers
和 Writers
都是不帶緩衝的,bufio
包裏提供了對應的帶緩衝的操作,在讀寫 UTF-8
編碼的文本文件時它們尤其有用。在 第12章 我們會看到很多在實戰使用它們的例子。
在實際編程中儘可能的使用這些接口,會使程序變得更通用,可以在任何實現了這些接口的類型上使用讀寫方法。
例如一個 JPEG
圖形解碼器,通過一個 Reader
參數,它可以解碼來自磁盤、網絡連接或以 gzip
壓縮的 HTTP
流中的 JPEG
圖形數據,或者其他任何實現了 Reader
接口的對象。
鏈接
- 目錄
- 上一節:第一個例子:使用Sorter接口排序
- 下一節:空接口