• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Golang > Go语言中io.Reader和io.Writer的详解与实现

Go语言中io.Reader和io.Writer的详解与实现

作者:daisy 字体:[增加 减小] 来源:互联网

daisy 通过本文主要向大家介绍了go语言,go语言环境搭建,go语言程序设计,let it go 25种语言,go语言教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、前言

也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里确很难形成一个对io接口的继承关系整天的概貌,原因在于godoc缺省并没有像javadoc一样显示官方库继承关系,这导致了我们对io接口的继承关系记忆不深,在使用的时候还经常需要翻文档加深记忆。

本文试图梳理清楚Go io接口的继承关系,提供一个io接口的全貌。

二、io接口回顾

首先我们回顾一下几个常用的io接口。标准库的实现是将功能细分,每个最小粒度的功能定义成一个接口,然后接口可以组成成更多功能的接口。

最小粒度的接口

type Reader interface {
  Read(p []byte) (n int, err error)
}
</div>
type Writer interface {
  Write(p []byte) (n int, err error)
}
</div>
type Closer interface {
  Close() error
}
</div>
type Seeker interface {
  Seek(offset int64, whence int) (int64, error)
}
</div>
type ReaderFrom interface {
  ReadFrom(r Reader) (n int64, err error)
}
</div>
type WriterTo interface {
  WriteTo(w Writer) (n int64, err error)
}
</div>
type ReaderAt interface {
  ReadAt(p []byte, off int64) (n int, err error)
}
</div>
type WriterAt interface {
  WriteAt(p []byte, off int64) (n int, err error)
}
</div>

以及

type ByteReader interface {
  ReadByte() (byte, error)
}
</div>
type ByteWriter interface {
  WriteByte(c byte) error
}
</div>

ByteScanner比ByteReader多了一个UnreadByte方法。

type ByteScanner interface {
  ByteReader
  UnreadByte() error
}
</div>
type RuneReader interface {
  ReadRune() (r rune, size int, err error)
}
</div>
type RuneScanner interface {
  RuneReader
  UnreadRune() error
}
</div>

组合接口

Go标准库还定义了一些由上面的单一职能的接口组合而成的接口。

type ReadCloser interface {
  Reader
  Closer
}
</div>
type ReadSeeker interface {
  Reader
  Seeker
}
</div>
type ReadWriter interface {
  Reader
  Writer
}
</div>
type ReadWriteCloser interface {
  Reader
  Writer
  Closer
}
</div>
type ReadWriteSeeker interface {
  Reader
  Writer
  Seeker
}
</div>
type WriteCloser interface {
  Writer
  Closer
}
</div>
type WriteSeeker interface {
  Writer
  Seeker
}
</div>

从它们的定义上可以看出,它们是最小粒度的组合。

最小接口的扩展

有些结构体struct实现并且扩展了接口,这些结构体是。

type LimitedReader struct {
  R Reader // underlying reader
  N int64 // max bytes remaining
}
</div>
type PipeReader struct {
  // contains filtered or unexported fields
}
</div>
type PipeWriter struct {
  // contains filtered or unexported fields
}
</div>
type SectionReader struct {
  // contains filtered or unexported fields
}
</div>

下面我会将它们的继承关系画出来。

一些辅助方法

一些辅助方法可以生成特殊类型的Reader或者Writer:

func LimitReader(r Reader, n int64) Reader
func MultiReader(readers ...Reader) Reader
func TeeReader(r Reader, w Writer) Reader
func MultiWriter(writers ...Writer) Writer
</div>

三、继承关系

当然,Go语言中并没有Java中那样的继承关系,而是基于duck type形式实现,我用下图尝试展示Go io接口的继承关系。

    其中黄色是 bufio 包下的类型,

    绿色是 archive.tar 包下的类型,

    蓝色是 bytes 包下的类型,

    粉红色是 strings包下的类型,

    紫色是 crypto.tls 包下的类型。

Rand是math.rand包下的类型。

File是os包下的内容。

`Rand`左边的那个Reader是image.jpeg下的内容。

我们最常用的是包io、bytes、bufio下的类型,所以这几个包下的类型要记牢,在第三库中经常会出现它们的身影。

上图中并没有把mime/multipart.File和 net/http.File列出来,主要是图太复杂了,它们实现的接口和os.File类似。

当然你可能会问,你怎么整理的它们的继承关系?事实上,你可以通过godoc -analysis=type -http=:6060生成带继承关系的Go doc,并且它还可以将你本地下载的库中的继承关系也显示出来。

四、总结

以上就是关于Go语言中io.Reader和io.Writer的详解与实现的全部内容,希望这篇文章的内容对大家的学习和工作能有所帮助,如果有疑问可以留言交流。

</div>

您可能想查找下面的文章:

  • 利用Go语言搭建WebSocket服务端方法示例
  • Go语言字典(map)用法实例分析【创建,填充,遍历,查找,修改,删除】
  • Go语言中更优雅的错误处理
  • Go语言实现的排列组合问题实例(n个数中取m个)
  • Go语言Cookie用法分析
  • GO语言运行环境下载、安装、配置图文教程
  • go语言文件正则表达式搜索功能示例
  • Go语言正则表达式用法实例小结【查找、匹配、替换等】
  • Go语言正则表达式示例
  • Go语言中三种不同md5计算方式的性能比较

相关文章

  • Go语言正则表达式示例
  • Go语言实现类似c++中的多态功能实例
  • Go语言里的结构体文法实例分析
  • Go语言常见哈希函数的使用
  • GOLANG版的冒泡排序和快速排序分享
  • 在Linux系统中安装Go语言的详细教程
  • Go语言struct类型详解
  • Go语言接口定义与用法示例
  • PHP与Go语言之间的通信详解
  • Go语言的管道Channel用法实例

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Go语言中使用反射的方法
    • golang 函数以及函数和方法的详解及区别
    • linux下通过go语言获得系统进程cpu使用情况的方法
    • Go语言函数学习教程
    • Go语言中的Slice学习总结
    • Go语言中常量定义方法实例分析
    • Go语言实现选择法排序实例
    • Go语言中反射的正确使用
    • GO语言(golang)基础知识
    • 利用Go语言初步搭建一个web应用的教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有