golang標準庫io

本文主要爲學習《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 對象
}
相關文章
相關標籤/搜索