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

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

io.WriteSeeker
io.ReadWriteSeeker
io.ReadSeeker
Seek
io.WriteSeeker
io.WriteCloser
io.ReadWriteSeeker
io.ReadWriteCloser
io.ReadWriter
ReadFrom
WriteTo
ReadAt
UnreadRune
UnreadByte
ReadRune
ReadByte
6个实现类型
5个扩展接口
io.Seeker
io.Closer
io.WriterAt
io.ByteWriter
io.Writer
io.ReaderFrom
io.WriterTo
io.ReaderAt
io.RuneScanner
io.ByteScanner
io.RuneReader
io.ByteReader
io.Reader
读写位置设定
关闭
写入
读取
4大类接口
io.WriteSeeker
io.ReadWriteSeeker
io.ReadSeeker
io.Seeker
io.WriterAt
io.ByteWriter
io.Writer
io.ReaderFrom
io.WriterTo
io.ReaderAt
io.RuneReader
io.ByteReader
io.Closer
io.Writer
io.Reader
11个简单接口
读写位置设定
写入操作
读取操作
核心接口
简单接口
思考题:io包中的同步内存管道的运作机制是什么?
11个简单接口,9个扩展接口
简单接口分为四大类:读取、写入、关闭、读写位置设定
核心接口只有3个:io.Reader、io.Writer、io.Closer
io包中的接口分为简单接口和扩展接口
接口扩展通过嵌入实现
问题:io包中的接口都有哪些?它们之间都有着怎样的关系?
总结
知识扩展
io包中的接口和工具

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

上一篇文章中,我主要讲到了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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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)

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

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

    作者回复: 加油加油!

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

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

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