在知乎上看到这样一个问题: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库。
推荐阅读