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

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

稳妥的Flush方法调用
跨过缓冲区直接写入
调用Flush方法
ReadFrom
WriteRune
WriteByte
WriteString
Write
删除暂存数据
写入底层写入器
wr
n
buf
err
错误处理
更新已写计数
填充缓冲区
压缩缓冲区
NewReaderSize
NewReader
lastRuneSize
lastByte
err
w
r
rd
buf
介于底层读取器与读取方法及其调用方之间
数据存储中介
总结
内部机制
数据写入方法
Flush方法
字段
fill方法
初始化函数
初始化字段
缓冲区作用
ReadWriter
Writer
Scanner
Reader
buffered I/O
bufio.Writer类型
bufio.Reader类型
bufio包
bufio包中的数据类型(上)
参考文章

该思维导图由 AI 生成,仅供参考

今天,我们来讲另一个与 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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

bufio包中的数据类型(上)介绍了bufio包中的Reader、Scanner、Writer和ReadWriter类型,重点讨论了bufio.Reader类型值中的缓冲区的作用,以及该类型的内部结构和初始化字段。缓冲区在Reader值中充当数据存储中介,优化了读取方法的执行时间,通过填充缓冲区降低了读取方法的平均执行时间。文章还介绍了Reader类型的初始化字段,以及填充缓冲区的fill方法的内部流程。总的来说,文章通过深入解析bufio.Reader类型的内部结构和相关方法,帮助读者更好地理解该类型的读取流程和优化机制。 在文章中,还回答了关于bufio.Writer类型值中缓冲的数据何时写入底层写入器的问题。通过介绍bufio.Writer类型的字段和Flush方法,阐述了数据写入缓冲区后的处理流程,以及在何种情况下会调用Flush方法将数据写入底层写入器。同时,强调了在理解内部机制后编写代码的重要性,以及在所有数据写入后调用Flush方法的稳妥性。 总的来说,本文通过深入解析bufio包中的Reader和Writer类型,帮助读者更好地理解其内部结构、优化机制和数据写入流程。同时,提供了对bufio.Writer类型中缓冲数据写入底层写入器的详细解释,为读者提供了深入的技术理解和编程指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

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

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

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

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

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

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

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

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

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