io重要的接口

     在介绍buffer之前,先来认识两个重要的接口,如下边所示:

type Reader interface {Read(p []byte) (n int, err error)
}type Writer interface {Write(p []byte) (n int, err error)
}

上边两个接口在golang sdk安装目录src/io/io.go中定义。后边凡是涉及到io相关操作的,基本上都实现了这两个接口,如:

1. package bufio 中的Reader类
2. package bytes 中的Reader类与Buffer类
3. package os 中 的File类,这个实现的最为复杂,主要由于在文件操作中,需要系统底层提供服务。
...不再一一列举...

经常听说有这么一句话:“使用I/O buffer,有助于提高效率”。但是,我想反问的是,真的提高了效率了吗?
    buffer在什么情况下会提高我们的程序性能呢?带着这个问题,我们来剖析一下上边提到的几个类。

1.第一个类bytes.Reader

这个类,实现了io.Reader接口,但是这个类没有实现io.Writer接口。这个类没有buffer,为啥?因为这个类,在初始化时,将字符流传入到对象中保存,没有提供Write方法写入新的字符流。所以,这个类不需要buffer。

2.第二个类bytes.Buffer

这个类实现了io.Reader与io.Writer接口,这个类在写入字节流的过程中,使用到了buffer,怎么实现的呢?
在初始化这个类时,会传入一个[]byte类型的slice到对象中,当Write方法向这个对象中写入字节流时,如果之前传入的这个[]byte申请的空间不够时,Write会调用自身的Grow方法,给这个[]byte类型的slice类型扩容,这样,这个里边的buffer会随着写入量增大,长度会不断的扩大。如果此处没有buffer的话,当写入容量满时,要么阻塞,要么循环写入,这样会导致系统卡死或数据被破坏,当引入buffer后,解决了上边的两个问题。但是这种解决方式,存在一个隐患,也就是如果出现读取死循环,这样会造成内存溢出。

3.第三个类bufio.Reader

这个类实现了io.Reader接口,这个类在实例化时,需要传入一个io.Reader类型的变量,这问题就来了,一个io.Reader类型的变量,一定是实现了Read方法了,那么为什么还需要装进bufio.Reader对象中呢?原来,bufio.Reader类中得Read方法,在读取字节流时,对传入的[]byte类型变量空间长度进行检查,如果传入变量的长度小于bufio.Reader初始化的容量,将会首先调用io.Reader自己的Read方法,将内容写入到bufio.Reader对象的buffer中,然后将值复制给传入的[]byte变量。这样做的好处是,在执行io.Reader的Read方法时,多读取一些字节,这样对于像文件操作就大有裨益。

4.第四个类os.File

这个类实现了io.Writer与io.Reader类,但是有点特殊的是,os.File的Read方法与Write均需要借助于系统层面的文件操作方法.总所周知,在文件读取时,Read与Write方法时没有缓存的,也就是你读几个字节,取决于你传入的变量容量是多少,如果容量为1,那么对于文件读取而言,就会很慢,所以将os.File的对象,传入到bufio.Reader对象中,这样可以在某些程度上提高效率,哪些时候呢?就是你在调用Read方法时,传入的变量容量太小时,会提高读取效率.但是bufio.Reader提供的Read方法不能保证每次读到的字符数一致,这个与其实现方式有关,但是不影响我们使用,只要确保收到EOF,再停止读取即可.

总结

在使用I/O操作时,bufio包提供了带buffer的方式读取I/O流,在操作文件读取,报文读取等上,可以在某种程度上提高效率,bufio中的类,并没有从底层实现Read与Write方法,只是限定了最小读取量.这个最小量就是bufio.Reader初始化长度.
bytes.Buffer提供的buffer十分强大,这个类不仅实现了io.Reader接口,还实现了io.Writer接口.所以bytes.Buffer的对象不仅可以读取,还可以追加写入,写入的过程中,容量还可以自动扩展,所以,功能十分强大.但是在使用时,要注意安全,bytes.Buffer会不断的扩大,扩大,最终还会panic.

参考:

https://www.yuque.com/docs/share/a60f24a5-4681-418d-9c50-e9c4841f8a55

Golang中的buffer相关推荐

  1. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

  2. Go实战--golang中使用redis(redigo和go-redis/redis这个已测试)

    自己做测试了没有问题,虚拟机连不上可以把包下载到本地. 版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/wangshubo1989/article/de ...

  3. golang中,new和make的区别

    在golang中,make和new都是分配内存的,但是它们之间还是有些区别的,只有理解了它们之间的不同,才能在合适的场合使用. 简单来说,new只是分配内存,不初始化内存: 而make即分配又初始化内 ...

  4. Golang中unsafe.Sizeof()的问题

     编辑 删除 *今天看到一段代码感觉很奇怪...* 代码的如下 package mainimport "unsafe" const (a = "abc"b ...

  5. golang中tcp socket粘包问题和处理

    http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格 ...

  6. golang中的字符串拼接

    go语言中支持的字符串拼接的方法有很多种,这里就来罗列一下 常用的字符串拼接方法 1.最常用的方法肯定是 + 连接两个字符串.这与python类似,不过由于golang中的字符串是不可变的类型,因此用 ...

  7. 七、golang中接口、反射

    一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package mainimport ("fmt" )t ...

  8. golang中出于性能考虑的那些实用代码片段 |字符串篇

    出于性能考虑的那些实用代码片段 |字符串篇 在我们编程时,总是需要考虑性能方面的问题,这既能降低成本,又能提高用户的体验.好的性能的代码总是有好处的. 字符串 字符串替换/修改 当我们需要修改或替换某 ...

  9. Linux操作系统中内存buffer和cache的区别

    我们一开始,先从Free命令说起. free 命令相对于top 提供了更简洁的查看系统内存使用情况: $ free                      total  used   free  s ...

最新文章

  1. 编译安装Ruby 1.9.3 安装CentOS
  2. Node-RED简介与Windows上安装、启动和运行示例
  3. Bootstrap4+MySQL前后端综合实训-Day08-PM【ajax获取表单标签内容、根据“栏目信息”添加“新闻信息”、新闻管理系统-项目展示】
  4. 李飞飞:新技术变革时代的数据库产业
  5. 通过nginx链接mysql事务问题_nginx-关于phpmysql的事务
  6. 微软程序员利用测试账户套现千万美元,或面临 20 年监禁
  7. java 框架 例子_如何设计Java框架? –一个简单的例子
  8. 计算机的微程序存放在dram,计算机组成与结构
  9. 这8种常见的SQL错误用法,你还在用吗?
  10. 微信支付 php详解,PHP实现微信支付实战案例详解
  11. pythonqt4上位机开发_上位机开发之单片机通信实践(一)
  12. Centos7 下安装mariadb及其基本操作
  13. cassandra学习笔记三
  14. 近年来最流行网络词汇及论坛用语
  15. Python大佬用20行代码带你打造一个微信聊天机器人(附代码)
  16. 2022-2028年中国饮用水行业市场专项调研及投资前景研究报告
  17. 数电(二)—分析/画逻辑电路图
  18. ce变速注入dll失败_调用CE变速DLL注入的软件含HOOK模块
  19. cubieboard服务器系统,cubieboard 搭建家用服务器
  20. 【电脑技术】查杀U盘蠕虫病毒

热门文章

  1. 联想笔记本关闭锁定计算机,如何打开或关闭ThinkPad笔记本电脑的滚动锁定功能...
  2. OMRON欧姆龙PLC与VB、C#通过以太网(FinsTCP/FinsUDP)、串口(FinsCom/HostLink)、DTU通讯的DLL
  3. wrf模式数据变量说明
  4. 冬去春来,名悦集团分享的这些用车小知识你知多少
  5. 华为U9508荣耀2四核ROOT及添加GMS
  6. linux系统怎么安装office软件,如何在Linux系统中安装OpenOffice
  7. form转化json
  8. 计算机英语缩写Adj,adj什么意思(adj缩写是什么意思)
  9. 最好的用xilinx ise给 fpga flash烧写的教程
  10. 宝塔计划任务不能使用