收藏!!!一图掌握 Go 中 IO 包的关系
2023-6-9 08:54:51 Author: Go语言中文网(查看原文) 阅读量:12 收藏

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


推荐阅读

福利
我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651454430&idx=1&sn=bda465ad4c4c191f4bc6228c3f371235&chksm=80bb252cb7ccac3aa1475e82f455181b2ee8366e57ea861071ec5726f6f6422db329b5bb0c61#rd
如有侵权请联系:admin#unsafe.sh