golang標準庫io

來源:互聯網
上載者:User

本文主要為學習《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 對象}

  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.