本文主要爲學習《Go語言標準庫》https://books.studygolang.com/The-Golang-Standard-Library-by-Example的筆記html
Go語言中的IO操做封裝在如下4個包中:golang
1) io: 爲IO原語(I/O primitives)提供基本的接口。緩存
2) io/ioutil: 封裝一些實用的I/O函數。函數
3) fmt: 實現格式化I/O。學習
4) bufio: 實現帶緩衝I/O。spa
1. io——基本的IO接口code
該包主要內容是定義了不少io相關的interface,做爲標準庫中其它函數的參數出現,其中最基礎重要的兩個接口是io.Reader和io.Writer。htm
type Reader interface { Read(p []byte) (n int, err error) }
官方說明:對象
Read 將 len(p) 個字節讀取到 p 中。它返回讀取的字節數 n(0 <= n <= len(p)) 以及任何遇到的錯誤。blog
即便 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 對象 }