Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
78704 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

42 | bufio包中的数据类型 (上)

今天,我们来讲另一个与 I/O 操作强相关的代码包bufiobufio是“buffered I/O”的缩写。顾名思义,这个代码包中的程序实体实现的 I/O 操作都内置了缓冲区。
bufio包中的数据类型主要有:
Reader
Scanner
WriterReadWriter
io包中的数据类型类似,这些类型的值也都需要在初始化的时候,包装一个或多个简单 I/O 接口类型的值。(这里的简单 I/O 接口类型指的就是io包中的那些简单接口。)
下面,我们将通过一系列问题对bufio.Reader类型和bufio.Writer类型进行讨论(以前者为主)。今天我的问题是:bufio.Reader类型值中的缓冲区起着怎样的作用?
这道题的典型回答是这样的。
bufio.Reader类型的值(以下简称Reader值)内的缓冲区,其实就是一个数据存储中介,它介于底层读取器与读取方法及其调用方之间。所谓的底层读取器,就是在初始化此类值的时候传入的io.Reader类型的参数值。
Reader值的读取方法一般都会先从其所属值的缓冲区中读取数据。同时,在必要的时候,它们还会预先从底层读取器那里读出一部分数据,并暂存于缓冲区之中以备后用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 人生入戏须尽欢
    bufio和bytes.buffer有什么区别吗

    作者回复: bufio 包中的 Reader 和 Writer 的主要作用是在已有的 IO 读取器或者写入器之上再包一层缓冲区,是面向 IO 操作。而 bytes.Buffer 是基于字节数组的缓冲区,是面向纯内存的。

    3
    22
  • 鲲鹏飞九万里
    赫老师,您好。这段话,您写得是不是有问题,我读了好几遍也不能理解。能否详细讲解下: “第二个事实,在压缩缓冲区之后,已写计数之后的字节只可能是已被读取过的字节,或者是已被拷贝到缓冲区头部的未读字节,又或者是代表未曾被填入数据的零值0x00。所以,后续的新字节是可以被写到这些位置上的。”

    作者回复: 这里说的是,以“已写计数”这个指针为界线,在缓冲区经过压缩之后,它后面会是什么样的数据。 1. 在压缩之后,在该指针之后有可能是已经被读取过的旧数据。正因为这些数据在该指针指向的位置之后,所以压缩时并不会清除它们,等到写入新数据时自然也就被覆盖掉了; 2. 在压缩之后,在该指针之后的数据也可能是那些(由于压缩的进行)已经被拷贝到缓冲区头部的(还未被读取的)数据,这些数据同样可以被后来的新数据覆盖掉,因为缓冲区头部已经存在这些数据了; 3. 在压缩之后,在该指针之后的数据还可能是“初始状态”的,因为那些数据槽位还没有被用到过,所以它们才是“初始状态”,如果某个数据槽位被用过的话,就会是前两种情况中的任意一种了。 首先,你要理解前面说的缓冲区数据压缩是做什么的,会有哪些具体操作,然后再来理解这里的含义。简单来说,压缩其实就是,删掉那些在缓冲区头部的、已经被读取过的数据,然后把后边的未读数据拷贝到缓冲区的头部。你可以再好好理解一下。

    归属地:北京
    2
    1
  • lesserror
    郝林老师你好。 请问一下,demo84.go中:示例4和示例5中,为什么调用Peek方法最后返回的字节切片的长度都为213呀。我想的是示例5中应该返回300才对的呀。

    作者回复: 这是因为底层的 reader 中总共只有 213 个字符啊,这与 buffer 的大小没有关系,要看有多少个字符是真正存在的。

    1
  • 小刚z
    bufio有并发都写的问题吗 看起来好像没有

    作者回复: bufio 没有自带锁,你要是想并发的话,需要自己加锁。

    归属地:广东
  • 到不了的塔
    bufio的应用场景应该是为了加快io速度,尤其是对比较零碎的数据(小数据)的io加速更明显。
    13
  • Cloud
    老师,什么场景适合使用bufio,能否举几个栗子呀
    1
    7
  • 疯琴
    对照源码看专栏,好理解好记忆。👍
    3
  • Wiwen
    如果Write方法发现需要写入的字节太多,同时缓冲区已空,直接写到底层写入器。 这个写入字节应该是新要写入的字节大小超过了缓存区的大小(默认值是4096)时,才直接写到底层写入器。
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部