本文實例分析了GO語io包的常用接口。分享給大家供大家參考。具體分析如下:
我沒有 C/C++ 基礎,沒有接口的概念,且從 Python 投奔而來,Python 的極簡主義(一個結果往往只提供一個方法),讓我在 Golang 中非常迷糊,特別是文件的讀寫操作,因為 Go 的文件讀寫操作有很多的方法,讓我不知道怎么選擇。直到我學習了 interface 的概念,然后由看了 package io 后才慢慢理解,也漸漸的喜歡上了 Golang 的靈活性。以我的經驗來說,接口是一個很重要的知識點,是一系列操作的規范,特別是公共接口尤為重要,如:package io
本文僅僅列舉最常用的幾個接口,如果您想系統的學習 io 接口,建議閱讀底部參考鏈接。
一、IO 接口概述
package os 提供了對 I/O 原語的基本接口,使之成為共享的公共接口,這些公共接口抽象出了泛用的函數并附加了一些相關的原語的操作。因為這些接口和原語是對底層實現完全不同的低水平操作的包裝,除非得到其它方面的通知,客戶端不應假設它們是并發執行安全的。
在 package os 中最重要的是兩個接口:Reader 和 Writer 接口。本章所提到的各種接口,都跟這兩個接口有關,也就是說,只要實現了這兩個接口,它就有了 IO 的功能。
小貼士:
var EOF = errors.New("EOF"): 在 package io中定義,使用非常頻繁。正常情況下當 Read() 無法得到更多返回時就返回 EOF,即文件到達了結尾(end-of-file)。
二、io.Reader 和 io.Writer
定義:
type Writer interface {
Write(p []byte) (n int, err error)
}
從接口名稱很容易猜到,一般地,Go中接口的命名約定:接口名以er結尾。注意,這里并非強行要求,你完全可以不以 er 結尾。標準庫中有些接口也不是以 er 結尾的。
示例:
p := make([]byte, 2) // 讀取 2 byte( len(buf)=2 )
if _, err := f.Read(p); err != nil {
log.Fatal("[F]", err)
}
fmt.Printf("讀取字符 /"%s/", 長度為 %d byte/n", p, len(p))
p = make([]byte, 50)
if _, err := f.Read(p); err != nil {
if err != io.EOF { //忽略 EOF 錯誤
log.Fatal("[F]", err)
}
}
fmt.Printf("讀取字符 /"%s/", 長度為 %d byte/n", p, len(p))
}
三、io.ReaderAt 和 os.WriterAt
定義(off 是 offset 的縮寫):
type WriterAt interface {
WriteAt(p []byte, off int64) (n int, err error)
}
示例:
f.WriteString("Go是一種令人愉悅的編程語言")
f.WriteAt([]byte("程序"), 26) //偏移 26byte 改寫“編程”->“程序”
fi, _ := f.Stat() //獲取文件信息
p := make([]byte, fi.Size()-2) //文件大小減去偏移值
f.ReadAt(p, 2) //偏移 2 byte
os.Stdout.Write(p)
}
四、io.ReaderFrom 和 os.WriterTo
定義:
type WriterTo interface {
WriteTo(w Writer) (n int64, err error)
}
WriteTo() 將數據寫入 w 中,直到沒有數據可寫或發生錯誤。返回寫入的字節數和任何錯誤。
示例:
w.ReadFrom(r) // w 一次性讀取 r 的全部內容
w.Flush()
r.Seek(0, os.SEEK_SET) //重置指針
r.WriteTo(w) // r 一次性將內容寫入 w 中
w.Flush()
}
五、io.Seeker
定義:
whence的值,在os包中定義了相應的常量:
定義:
七、其他
type RuneReader interface {
ReadRune() (r rune, size int, err error)
}
參考:
https://gowalker.org/io
https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.1.md
希望本文所述對大家的GO語言程序設計有所幫助。
新聞熱點
疑難解答