本文主要為學習《Go語言標準庫》https://books.studygolang.com/The-Golang-Standard-Library-by-Example的筆記
Go語言中的IO操作封裝在以下4個包中:
1) io: 為IO原語(I/O primitives)提供基本的介面。
2) io/ioutil: 封裝一些實用的I/O函數。
3) fmt: 實現格式化I/O。
4) bufio: 實現帶緩衝I/O。
1. io——基本的IO介面
該包主要內容是定義了很多io相關的interface,作為標準庫中其它函數的參數出現,其中最基礎重要的兩個介面是io.Reader和io.Writer。
type Reader interface { Read(p []byte) (n int, err error)}
官方說明:
Read 將 len(p) 個位元組讀取到 p 中。它返回讀取的位元組數 n(0 <= n <= len(p)) 以及任何遇到的錯誤。
即使 Read 返回的 n < len(p),它也會在調用過程中佔用 len(p) 個位元組作為暫存空間。
若可讀取的資料不到 len(p) 個位元組,Read 會返回可用資料,而不是等待更多資料。
當 Read 在成功讀取 n > 0 個位元組後遇到一個錯誤或 EOF (end-of-file),它會返回讀取的位元組數。
它可能會同時在本次的調用中返回一個non-nil錯誤,或在下一次的調用中返回這個錯誤(且 n 為 0)。
一般情況下, Reader會返回一個非0位元組數n, 若 n = len(p) 個位元組從輸入源的結尾處由 Read 返回,Read可能返回 err == EOF 或者 err == nil。並且之後的 Read() 都應該返回 (n:0, err:EOF)。
調用者在考慮錯誤之前應當首先處理返回的資料。這樣做可以正確地處理在讀取一些位元組後產生的 I/O 錯誤,同時允許EOF的出現。
type Writer interface { Write(p []byte) (n int, err error)}
官方說明:
Write 將 len(p) 個位元組從 p 中寫入到基本資料流中。它返回從 p 中被寫入的位元組數 n(0 <= n <= len(p))以及任何遇到的引起寫入提前停止的錯誤。
若 Write 返回的 n < len(p),它就必須返回一個 非nil 的錯誤。
這些interface被標準庫中的哪些struct實現?下面羅列幾個:
* os.File同時實現了io.Reader和io.Writer
* strings.Reader實現了io.Reader
* bufio.Reader/Writer分別實現了io.Reader和io.Writer
* bytes.Buffer同時實現了io.Reader和io.Writer
* bytes.Reader實現了io.Reader
更多資訊可以訪問http://docs.studygolang.com./pkg/查詢。
其它一些列介面:
type ReaderAt interface { ReadAt(p []byte, off int64) (n int, err error)}type WriterAt interface { WriteAt(p []byte, off int64) (n int, err error)}type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error)}type WriterTo interface { WriteTo(w Writer) (n int64, err error)}type Seeker interface { Seek(offset int64, whence int) (ret int64, err error)}type Closer interface { Close() error}type ByteReader interface { ReadByte() (c byte, err error)}type ByteWriter interface { WriteByte(c byte) error}
此外還有ByteScanner、RuneReader、RuneScanner、ReadCloser、ReadSeeker、ReadWriteCloser、ReadWriteSeeker、ReadWriter、WriteCloser、WriteSeeker。
詳情閱讀https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter01/01.1.html
2. ioutil——方便的IO操作函數集
1) NopCloser函數
將io.Reader的執行個體轉換為io.ReadCloser執行個體。
2) ReadAll函數
func ReadAll(r io.Reader) ([]byte, error)
一次性讀取io.Reader中的資料
3) ReadDir函數
讀取目錄並返回排好序的檔案和子目錄名。
4) ReadFile和WriteFile函數
func ReadFile(filename string) ([]byte, error)
ReadFile 從filename指定的檔案中讀取資料並返迴文件的內容。成功的調用返回的err為nil而非EOF。因為本函數定義為讀取整個檔案,它不會將讀取返回的EOF視為應報告的錯誤。
func WriteFile(filename string, data []byte, perm os.FileMode) error
WriteFile 將data寫入filename檔案中,當檔案不存在時會根據perm指定的許可權進行建立一個,檔案存在時會先清空檔案內容。對於perm參數,我們一般可以指定為:0666,具體含義os包中講解。
5) TempDir和TempFile函數
建立臨時目錄。
3. fmt —— 格式化IO
4. bufio——緩衝IO
1) bufio.Reader
封裝了一個io.Reader對象,提供緩衝功能,同時實現了io.Reader介面。
type Reader struct { buf []byte // 緩衝 rd io.Reader // 底層的io.Reader // r:從buf中讀走的位元組(位移);w:buf中填充內容的位移; // w - r 是buf中可被讀的長度(快取資料的大小),也是Buffered()方法的傳回值 r, w int err error // 讀過程中遇到的錯誤 lastByte int // 最後一次讀到的位元組(ReadByte/UnreadByte) lastRuneSize int // 最後一次讀到的Rune的大小(ReadRune/UnreadRune)}
2) bufio.Writer
封裝了一個io.Writer對象,提供緩衝功能,同時實現了io.Writer介面。
type Writer struct { err error // 寫過程中遇到的錯誤 buf []byte // 緩衝 n int // 當前緩衝中的位元組數 wr io.Writer // 底層的 io.Writer 對象}