41 | io包中的接口和工具 (下)
该思维导图由 AI 生成,仅供参考
知识扩展
问题:io包中的接口都有哪些?它们之间都有着怎样的关系?
- 深入了解
- 翻译
- 解释
- 总结
io包中的接口和工具(下)一文详细介绍了Go语言标准库中io包中的接口体系。文章首先介绍了io包中的核心接口,包括io.Reader、io.Writer和io.Closer,以及它们的扩展接口和实现类型。接着,文章对简单接口进行了分类,分为读取、写入、关闭和读写位置设定四大类,详细介绍了每个类别的简单接口、扩展接口和代表性实现类型。此外,文章还介绍了一些重要程序实体的功能和机理,如数据段读取器io.SectionReader、同步内存管道核心实现的io.pipe类型,以及用于数据拷贝的io.CopyN函数等。最后,文章强调了io包中的简单接口共有11个,提出了思考题:io包中的同步内存管道的运作机制是什么?通过本文,读者可以全面了解io包中的接口体系,以及在实践中如何编写数据类型来实现io包中的接口,以获得最大的好处。
《Go 语言核心 36 讲》,新⼈⾸单¥59
全部留言(13)
- 最新
- 精选
- noisyesfunc (p *pipe) Read(b []byte) (n int, err error) { select { case <-p.done: return 0, p.readCloseError() default: } select { case bw := <-p.wrCh: nr := copy(b, bw) p.rdCh <- nr return nr, nil case <-p.done: return 0, p.readCloseError() } } 以上是pipereader的代码,有个疑问select语句中 p.wrCh和p.done同时有信号产生,但是最终选择了done的分支语句,是不是就意味着后续数据就没法读出来了,这种情况是正常的吗
作者回复: 简短的回答:是这样的。这是正常的。 复杂的回答: 实际上,“同时”是不可能发生的(说到底,任何代码的执行总会有先后,最多在时间上的距离非常非常非常近而已)。我们只能说在一段很短的时间段内,它们同时执行了(但现在大家常常简写为“同时执行”)。 如果这种“同时执行”的情况真的发生了,那么“它们谁先谁后”这种太过细微的判断就只能忽略不计了。一个原因是这种判断的成本远远大于收益,另一个原因是实在没有必要扣这么细。 所以,当 pipe 中的 wrCh 有“信号”的同时 done 也有“信号”,那么在此次直接返回 readCloseError 与在下次读时再返回 readCloseError 的差别可以忽略不计。原因我在上面说过了。 它们的结局都是“因 pipe 被提前关闭,导致数据读取不完整”。 在程序设计上,我们应该在 Write 方法的调用一方关闭 pipe。如果 Write 方法正常执行结束,那么你说的这种情况就不会出现,因为 Write 方法中有如下代码: for once := true; once || len(b) > 0; once = false { select { case p.wrCh <- b: nw := <-p.rdCh // 此行是关键。 // ...... }
2021-04-197 - NIXUS本以为go标准库, 学习起来会比前面的轻松一些的, 结果发现完全不是这么回事, 感觉比之前学起来更累
作者回复: 加油加油!
2019-04-191 - manateeio包包含的类型需要好好再消化一下
作者回复: 嗯,必须的,这些类型很核心。
2019-03-15 - 虢國技醬二刷 io包中io.go文件中的相关接口,特别是函数和类型方法的实现的代码写的真是简洁、精炼!看后真是惭愧自己什么时候能写出这么简洁优雅的代码! 墙裂推荐io.go源码,叹为观止2019-12-1117
- 我要攻击之爪郝总,身体怎么样了,祝早日康复!2018-11-1411
- 我来也感觉这个专栏很值。最开始写的11月2号更新完,现在还在更。最近这几章的基础包,我只是过了一遍,觉得写的很详细,但自己消化的很有限。准备过段时间了再回过头来看看。2018-11-196
- CcczzZio相关文章偏源码,需要慢慢消化,日常开发还未使用到,但是它实现的接口组合方式,却是在日常开发经常用到的,赞!2020-02-062
- 嘎嘎分为读写wr、rd 两个chan,均为阻塞。writer在wr中无未读取数据时写入,reader读取到数据后,向rd写入读取到的数据的长度。2019-04-031
- lovyhui问题: 基于非缓冲通道传输数据, 堵塞读, 直至结束. 堵塞写, 根据通道已读计数,计算每一次写入通道的数据, 直至结束2018-12-231
- Jasonio包中的同步内存管道的运作机制是通过pipe中的rdCh和wrCh进行数据的流转。读端会一直阻塞直到写端写入数据,或者写端关闭管道。写端会一直阻塞直到读端读走数据或读端关闭管道。写端会根据读端返回的读取长度,来继续写入数据,并保证写入的数据能完整的被读端读取。2022-10-14归属地:浙江