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

41 | io包中的接口和工具 (下)

上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型。当然,io代码包中的核心接口不止io.Reader一个。
我们基于它引出的一条主线,只是io包类型体系中的一部分。我们很有必要再从另一个角度去探索一下,以求对io包有更加全面的了解。
下面的一个问题就与此有关。

知识扩展

问题:io包中的接口都有哪些?它们之间都有着怎样的关系?

我们可以把没有嵌入其他接口并且只定义了一个方法的接口叫做简单接口。在io包中,这样的接口一共有 11 个。
在它们之中,有的接口有着众多的扩展接口和实现类型,我们可以称之为核心接口io包中的核心接口只有 3 个,它们是:io.Readerio.Writerio.Closer
我们还可以把io包中的简单接口分为四大类。这四大类接口分别针对于四种操作,即:读取、写入、关闭和读写位置设定。前三种操作属于基本的 I/O 操作。
关于读取操作,我们在前面已经重点讨论过核心接口io.Reader。它在io包中有 5 个扩展接口,并有 6 个实现类型。除了它,这个包中针对读取操作的接口还有不少。我们下面就来梳理一下。
首先来看io.ByteReaderio.RuneReader这两个简单接口。它们分别定义了一个读取方法,即:ReadByteReadRune
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • noisyes
    func (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 // 此行是关键。 // ...... }

    6
  • NIXUS
    本以为go标准库, 学习起来会比前面的轻松一些的, 结果发现完全不是这么回事, 感觉比之前学起来更累

    作者回复: 加油加油!

    1
  • manatee
    io包包含的类型需要好好再消化一下

    作者回复: 嗯,必须的,这些类型很核心。

  • 虢國技醬
    二刷 io包中io.go文件中的相关接口,特别是函数和类型方法的实现的代码写的真是简洁、精炼!看后真是惭愧自己什么时候能写出这么简洁优雅的代码! 墙裂推荐io.go源码,叹为观止
    16
  • 我要攻击之爪
    郝总,身体怎么样了,祝早日康复!
    11
  • 我来也
    感觉这个专栏很值。最开始写的11月2号更新完,现在还在更。最近这几章的基础包,我只是过了一遍,觉得写的很详细,但自己消化的很有限。准备过段时间了再回过头来看看。
    6
  • CcczzZ
    io相关文章偏源码,需要慢慢消化,日常开发还未使用到,但是它实现的接口组合方式,却是在日常开发经常用到的,赞!
    2
  • 嘎嘎
    分为读写wr、rd 两个chan,均为阻塞。writer在wr中无未读取数据时写入,reader读取到数据后,向rd写入读取到的数据的长度。
    1
  • lovyhui
    问题: 基于非缓冲通道传输数据, 堵塞读, 直至结束. 堵塞写, 根据通道已读计数,计算每一次写入通道的数据, 直至结束
    1
  • Jason
    io包中的同步内存管道的运作机制是通过pipe中的rdCh和wrCh进行数据的流转。读端会一直阻塞直到写端写入数据,或者写端关闭管道。写端会一直阻塞直到读端读走数据或读端关闭管道。写端会根据读端返回的读取长度,来继续写入数据,并保证写入的数据能完整的被读端读取。
    归属地:浙江
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部