40 | io包中的接口和工具 (上)
![](https://static001.geekbang.org/resource/image/86/37/86d40335594d8bfc37e80d0fcbfb9e37.jpg)
该思维导图由 AI 生成,仅供参考
知识回顾
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
本文深入探讨了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-2611 - Geek_a8be59func (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-244 - 手指饼干请教老师,文中提到io包中io.Reader接口的实现类型:*io.LimitedReader、*io.SectionReader、*io.teeReader、io.multiReader、io.pipe、io.PipeReader,后三项为什么不是指针类型实现了Reader接口?
作者回复: 它们都应该有“*”的,可以是编辑的时候落下了。我去跟极客的编辑说一下。谢谢。
2019-10-144 - 安排go语言中的操作字符串的函数都不再以\0作为字符串结束标记了吗?
作者回复: 在底层依然以 0 结尾,只不过不会暴露出来而已。
2019-09-2232 - 窗外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-182 - 虢國技醬打卡 对着源码io包看老师的课程,感觉讲解的非常准确,就是目前再看pipo.go文件时还是有点吃力,其他源码没什么难度2019-03-0817
- someoneio.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归属地:上海