前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一图掌握golang中IO包的关系

一图掌握golang中IO包的关系

作者头像
Go学堂
发布2023-08-28 14:48:28
3780
发布2023-08-28 14:48:28
举报
文章被收录于专栏:Go工具箱

大家好,我是渔夫子。

今天在知乎上看到这样一个问题: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函数就把这两步做了封装,供客户端调用,是不是就更方便了。如下代码:

代码语言:javascript
复制
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库。

好了,今天就分享到这里。

你的关注,是我写下去的最大动力。点击下方公众号卡片,直接关注。关注送《100个go常见的错误》pdf文档、经典go学习资料。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档