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

40 | io包中的接口和工具 (上)

io.ReaderFrom
io.stringWriter
io.ByteWriter
io.Writer
io.WriterTo
io.RuneScanner
io.ByteScanner
io.RuneReader
io.ByteReader
io.Reader
io.WriterTo
io.RuneScanner
io.ByteScanner
io.Seeker
io.RuneReader
io.ByteReader
io.ReaderAt
io.Reader
io.stringWriter (io.StringWriter)
fmt.Stringer
io.ByteWriter
io.Writer
*io.PipeReader
*io.pipe
*io.multiReader
*io.teeReader
*io.SectionReader
*io.LimitedReader
io.ReadWriteSeeker
io.ReadSeeker
io.ReadWriteCloser
io.ReadCloser
io.ReadWriter
实现的写入相关接口
实现的读取相关接口
实现的接口
实现的接口
下一节继续讲解io包中的接口内容
核心接口:io.Reader, io.Writer
io包中的接口对标准库和第三方库都重要
io.Reader的实现类型
io.Reader的扩展接口
参数类型不限定于具体类型,只需实现相应接口
例子:io.Copy, io.CopyBuffer, io.CopyN
互操作性提高
bytes.Buffer
strings.Reader
strings.Builder
总结
问题解析
前导内容:io包中接口的好处与优势
知识回顾
io包中的接口和工具

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

我们在前几篇文章中,主要讨论了strings.Builderstrings.Readerbytes.Buffer这三个数据类型。

知识回顾

还记得吗?当时我还问过你“它们都实现了哪些接口”。在我们继续讲解io包中的接口和工具之前,我先来解答一下这个问题。
strings.Builder类型主要用于构建字符串,它的指针类型实现的接口有io.Writerio.ByteWriterfmt.Stringer。另外,它其实还实现了一个io包的包级私有接口io.stringWriter(自 Go 1.12 起它会更名为io.StringWriter)。
strings.Reader类型主要用于读取字符串,它的指针类型实现的接口比较多,包括:
io.Reader
io.ReaderAt
io.ByteReader
io.RuneReader
io.Seeker
io.ByteScanner
io.RuneScanner
io.WriterTo
共有 8 个,它们都是io包中的接口。
其中,io.ByteScannerio.ByteReader的扩展接口,而io.RuneScanner又是io.RuneReader的扩展接口。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Go语言中`io`包中的接口和工具,重点介绍了`strings.Builder`、`strings.Reader`和`bytes.Buffer`这三个数据类型在`io`包中的灵活应用和功能特点。通过具体的数据类型和接口实现,展示了这些工具在Go语言中的灵活应用和功能特点。此外,文章还强调了`io`包中的接口对于Go语言的标准库和第三方库的重要性,以及`io.Reader`的扩展接口和实现类型。总体而言,本文通过具体的例子和技术细节,展示了Go语言中`io`包中的接口和工具的灵活应用和功能特点,以及对Go语言标准库和第三方库的重要性。

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

全部留言(7)

  • 最新
  • 精选
  • 下雨天
    老师,扩展接口和实现接口有什么不同吗?我看golang文档,你说的扩展接口io.ReadWriter里面也实现了Reader接口,实现如下: type ReadWriter interface { Reader Writer }

    作者回复: 扩展接口其实就是,通过向自身嵌入其他接口来达到扩展那个接口的目的。这里的 ReadWriter 就是这么做的,它把 Reader 接口和 Writer 接口嵌入自身。 如此一来,ReadWriter 就是 Reader 和 Writer 的超集了,或者说,ReadWriter 的方法集合里囊括了 Reader 和 Writer 中所定义的那些方法。 所以,接口只能“扩展接口”,而不能“实现接口”。结构体等类型恰恰相反。

    2020-10-26
    11
  • Geek_a8be59
    func (p *pipe) Write(b []byte) (n int, err error) { select { case <-p.done: return 0, p.writeCloseError() default: p.wrMu.Lock() defer p.wrMu.Unlock() } for once := true; once || len(b) > 0; once = false { select { case p.wrCh <- b: nw := <-p.rdCh b = b[nw:] n += nw case <-p.done: return n, p.writeCloseError() } } return n, nil } 这是*io.pipe的方法,针对这个源码有两个问题请教 1、这个for循环里面一开始 once = true,而且第一次进来的len(b)=0 的情况下(即我传入的b为空),进入有什么意义?是不是应该把这个排除掉? 2、case p.wrCh <- b, 将b写入的到wrCh的chan中,为何还要读取他实际read读取到的数量,不是应该全部读出么,或者说什么情况下会出现在channel没有一次性读完的情况 ?

    作者回复: 第一个问题: 为什么b的长度为0就不能写啊?写空切片可以作为一种信号机制啊。 第二个问题: 不一定会全读出啊,这取决于Read方法的参数值b的实际长度。而这个b的实际长度又是完全由Read方法的调用方掌控的。

    2020-07-24
    4
  • 手指饼干
    请教老师,文中提到io包中io.Reader接口的实现类型:*io.LimitedReader、*io.SectionReader、*io.teeReader、io.multiReader、io.pipe、io.PipeReader,后三项为什么不是指针类型实现了Reader接口?

    作者回复: 它们都应该有“*”的,可以是编辑的时候落下了。我去跟极客的编辑说一下。谢谢。

    2019-10-14
    4
  • 安排
    go语言中的操作字符串的函数都不再以\0作为字符串结束标记了吗?

    作者回复: 在底层依然以 0 结尾,只不过不会暴露出来而已。

    2019-09-22
    3
    2
  • 窗外
    func (b *Builder) Write(p []byte) (int, error) { b.copyCheck() b.buf = append(b.buf, p...) return len(p), nil } 老师,帮忙看看上面的代码中p...,这个...是什么语法糖?我记得在数组章节中,不设置数组的长度时,可以这样写:var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

    作者回复: p... 相当于把数组或切片 p 中的所有元素值都作为独立的参数值传入 append 函数。

    2019-08-18
    2
  • 虢國技醬
    打卡 对着源码io包看老师的课程,感觉讲解的非常准确,就是目前再看pipo.go文件时还是有点吃力,其他源码没什么难度
    2019-03-08
    1
    7
  • someone
    io.LimitedReader 和 io.SectionReader 都是 Golang 中的 Reader 接口的实现。它们的作用都是限制从底层 Reader 中读取的字节数量,但它们的实现方式略有不同。 相同点: 都实现了 Reader 接口,可以用于从底层 Reader 中读取数据,并且都可以限制读取的字节数。 都使用了一个内部变量来记录已经读取的字节数,以便在达到限制时停止读取。 不同点: io.LimitedReader 通过一个指定的长度来限制读取的字节数,而 io.SectionReader 则通过一个指定的偏移和长度来限制读取的字节数。也就是说,io.SectionReader 可以从底层 Reader 中的任意位置开始读取数据,而 io.LimitedReader 只能从底层 Reader 的开头位置开始读取数据。 io.SectionReader 还实现了 Seeker 接口,可以通过 Seek 方法来改变当前读取位置,而 io.LimitedReader 没有实现 Seeker 接口,只能从底层 Reader 的开头位置开始读取数据。
    2023-05-16归属地:上海
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部