一圖掌握 golang 中 IO 包的關係

大家好,我是漁夫子。

今天在知乎上看到這樣一個問題:Golang 的 IO 庫那麼多,我該怎麼選。今天就跟大家聊聊這個問題。

首先,我們要知道,golang 中有哪些 IO 包。我整理了一下,大概有 io 包、bufio 包、ioutil、os、net 等。

其次,要知道這些 io 包的各自的定位。我整理了一張圖供大家參考:

我們大致講解下上圖:

我們以 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