一圖掌握 golang 中 IO 包的關係
大家好,我是漁夫子。
今天在知乎上看到這樣一個問題:Golang 的 IO 庫那麼多,我該怎麼選。今天就跟大家聊聊這個問題。
首先,我們要知道,golang 中有哪些 IO 包。我整理了一下,大概有 io 包、bufio 包、ioutil、os、net 等。
其次,要知道這些 io 包的各自的定位。我整理了一張圖供大家參考:
我們大致講解下上圖:
-
io:基礎的 IO 庫,提供了 Reader 和 Writer 接口。其中的 os 包、net 包、string 包、bytes 包以及 bufio 包都實現了 io 中的 Reader 或 Writer 接口。
-
os:提供了訪問底層操作系統資源的能力,如文件讀寫、進程控制等。
-
net:提供了網絡相關的 IO 功能,如 TCP、UDP 通信、HTTP 請求等。
-
string.Reader:提供了 string 的讀取。因爲 string 不能寫,所以只有 Reader。
-
bytes.Buffer 和 Reader:提供了對字節內容的讀寫。
-
bufio:提供帶緩存的 I/O 操作,解決頻繁、少量讀取場景下的性能問題。這裏利用了計算機的局部性原理。
-
ioutil:提供了一些方便的文件讀寫函數,如 ReadFile 和 WriteFile。
我們以 iotuil 包爲例,看下 ReadDir 函數的實現。ReadDir 函數的功能就是從一個目錄中讀取所有的文件列表。這個操作其實包含兩步:打開文件、讀取目錄下的文件。ReadDir 函數就把這兩步做了封裝,供客戶端調用,是不是就更方便了。如下代碼:
func ReadDir(dirname string) ([]fs.FileInfo, error) {
f, err := os.Open(dirname)
if err != nil {
return nil, err
}
list, err := f.Readdir(-1)
f.Close()
if err != nil {
return nil, err
}
sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
return list, nil
}
所以,選擇哪個庫主要取決於你要進行什麼樣的操作。如果只是簡單的文件讀寫,可以使用 ioutil 庫;如果需要處理大量數據,則應該選擇 bufio 庫;如果需要訪問底層操作系統功能,則可以使用 os 庫;如果涉及到網絡通信,則選擇 net 庫。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/s4y7xOkEJnC0EcOOS_ycsw