42 | bufio包中的数据类型 (上)
该思维导图由 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-05322 - 鲲鹏飞九万里赫老师,您好。这段话,您写得是不是有问题,我读了好几遍也不能理解。能否详细讲解下: “第二个事实,在压缩缓冲区之后,已写计数之后的字节只可能是已被读取过的字节,或者是已被拷贝到缓冲区头部的未读字节,又或者是代表未曾被填入数据的零值0x00。所以,后续的新字节是可以被写到这些位置上的。”
作者回复: 这里说的是,以“已写计数”这个指针为界线,在缓冲区经过压缩之后,它后面会是什么样的数据。 1. 在压缩之后,在该指针之后有可能是已经被读取过的旧数据。正因为这些数据在该指针指向的位置之后,所以压缩时并不会清除它们,等到写入新数据时自然也就被覆盖掉了; 2. 在压缩之后,在该指针之后的数据也可能是那些(由于压缩的进行)已经被拷贝到缓冲区头部的(还未被读取的)数据,这些数据同样可以被后来的新数据覆盖掉,因为缓冲区头部已经存在这些数据了; 3. 在压缩之后,在该指针之后的数据还可能是“初始状态”的,因为那些数据槽位还没有被用到过,所以它们才是“初始状态”,如果某个数据槽位被用过的话,就会是前两种情况中的任意一种了。 首先,你要理解前面说的缓冲区数据压缩是做什么的,会有哪些具体操作,然后再来理解这里的含义。简单来说,压缩其实就是,删掉那些在缓冲区头部的、已经被读取过的数据,然后把后边的未读数据拷贝到缓冲区的头部。你可以再好好理解一下。
2023-03-07归属地:北京21 - lesserror郝林老师你好。 请问一下,demo84.go中:示例4和示例5中,为什么调用Peek方法最后返回的字节切片的长度都为213呀。我想的是示例5中应该返回300才对的呀。
作者回复: 这是因为底层的 reader 中总共只有 213 个字符啊,这与 buffer 的大小没有关系,要看有多少个字符是真正存在的。
2021-08-281 - 小刚zbufio有并发都写的问题吗 看起来好像没有
作者回复: bufio 没有自带锁,你要是想并发的话,需要自己加锁。
2023-05-18归属地:广东 - 到不了的塔bufio的应用场景应该是为了加快io速度,尤其是对比较零碎的数据(小数据)的io加速更明显。2018-11-1913
- Cloud老师,什么场景适合使用bufio,能否举几个栗子呀2018-11-1917
- 疯琴对照源码看专栏,好理解好记忆。👍2020-01-133
- Wiwen如果Write方法发现需要写入的字节太多,同时缓冲区已空,直接写到底层写入器。 这个写入字节应该是新要写入的字节大小超过了缓存区的大小(默认值是4096)时,才直接写到底层写入器。2019-02-17