golang源码解读之io包

关于io包

io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。

因为这些接口和原语是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发执行安全的。

原语:计算机进程的控制通常由原语完成。所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中

错误变量

// ErrShortWrite意味着写入接受的字节数少于请求的字节数,但未能返回显式错误
var ErrShortWrite = errors.New("short write")

// 表示读取所需的缓冲区比提供的缓冲区长。
var ErrShortBuffer = errors.New("short buffer")

// EOF是当没有更多的输入可用时,Read返回的错误
// 函数应该只返回EOF来表示输入的优美结束,如果EOF在结构化数据流中意外发生,则相应的错误可能是ErrUnexpectedEOF ,也可能是提供更多细节的其他错误。
var EOF = errors.New("EOF")

// 表示在读取固定大小的块或数据结构时遇到EOF。
var ErrUnexpectedEOF = errors.New("unexpected EOF")

// 当许多Read 读取调用未能返回任何数据或错误(通常是io.Reader实现中断的标志)时,ioReader的某些客户端将返回ErrNoProgress
var ErrNoProgress = errors.New("multiple Read calls return no data or error")

基础接口

1、Reader 接口
只要实现了 Read()方法的对象都可以作为io.Read接口传递
Read() 方法 将len(p)字节读入p, 返回读取的字节数(0<=n<=len§)。即使Read返回n<len(p),它也可能在调用期间使用所有p作为暂存空间。 若一些数据可用但不到 len§ 个字节,Read 会照例返回可用的东西,而不是等待更多。
当Read在成功读取n>0字节后遇到错误或文件结束条件时,它返回读取的字节数。它会从相同的调用中返回(非nil的)错误或从随后的调用中返回错误(和 n == 0)

type Reader interface {
   
	Read(p []byte) (n int, err error)	
	}

2、Writer接口
只要实现了 Write()方法的对象都可以作为io.Writer接口传递
Write() 方法len( p )字节数据从p写入底层的数据流。它会返回写入的字节数(0 <= n <= len( p ))和遇到的任何导致写入提取结束的错误。
Write必须返回非nil的错误,如果它返回的 n < len( p )。Write不能修改切片p中的数据,即使临时修改也不行。

type Writerinterface {
   
	Write(p []byte) (n int, err error)	
	}

3、Closer接口
Closer关闭的接口, 带有Close() 方法, 但是行为没有定义,所以 可以特定行为来实现
在整个标准库内都没有对Closer的引用,只有实现,用法都是开启某某连接/流,在用完/报错后在进行Close的操作。

type Closer interface {
   
	Close() error
}

4、Seeker接口
Seeker接口用于包装基本的移位方法。返回相对于文件开头的新偏移量(新的位置)和错误

Seek()设置设定下一次读写的位置:偏移量为offset,校准点由whence确定:0 SeekStart表示相对于文件起始;1 SeekCurrent表示相对于当前位置;2 SeekEnd表示相对于文件结尾。

移动到一个绝对偏移量为负数的位置会导致错误。移动到任何偏移量为正数的位置都是合法的,但其下一次I/O操作的具体行为则要看底层的实现。

在整个标准库内都没有对Seeker的引用,只有实现

type Seeker interface {
   
	Seek(offset int64, whence int) (int64, error)
}

组合接口

组合接口是对多个接口进行了组合,当同时实现多个接口时,可以使用组合接口进行传递\

// 对基本读写方法进行分组的接口
type ReadWriter interface {
   
	Reader
	Writer
}
// 带有 Closer 关闭 接口的 Reader 新接口
// 是对基本的Read 和Close方法 进行分组的接口
type ReadCloser interface {
   
	Reader
	Closer
}
// 是对基本写入和关闭方法进行分组的接口
type WriteCloser interface {
   
	Writer
	Closer
}
// 是对基本的读、写和关闭方法进行分组的接口。
type ReadWriteCloser interface {
   
	Reader
	Writer
	Closer
}
// 对基本的Read和Seek方法进行分组的接口。
type ReadSeeker interface {
   
	Reader
	Seeker
}
// 是对基本的写入和查找方法进行分组的接口。
type WriteSeeker interface {
   
	Writer
	Seeker
}
// 是一个接口,它将基本的读、写和查找方法分组。
type ReadWriteSeeker interface {
   
	Reader
	Writer
	Seeker
}

指定读写器 读写接口

1、ReaderFrom接口
ReadFrom方法的包装,该方法 从r读取数据,直到EOF或出错。n是读取的字节数。 Copy 函数使用ReaderFrom(如果可用)

type ReaderFrom interface {
   
	ReadFrom(r Reader) (n int64, err error)		
}

2、WriterTo接口
WriterTo方法的包装, 将数据写入w,直到没有更多数据可写入或出现错误,n是写入的字节数

type WriterTo interface {
   
	WriteTo(w Writer) (n int64, err error)		
}

指定偏移量 读写接口

1、ReaderAt接口
ReadAt从底层输入流的偏移量off位置读取len§字节数据写入p, 它返回读取的字节数(0 <= n <= len§)和遇到的任何错误。当ReadAt方法返回值n < len§时,它会返回一个非nil的错误来说明为啥没有读取更多的字节。在这方面,ReadAt是比Read要严格的。即使ReadAt方法返回值 n < len§,它在被调用时仍可能使用p的全部长度作为暂存空间。如果有部分可用数据,但不够len§字节,ReadAt会阻塞直到获取len§个字节数据或者遇到错误。在这方面,ReadAt和Read是不同的。如果ReadAt返回时到达输入流的结尾,而返回值n == len§,其返回值err既可以是EOF也可以是nil。

如果ReadAt是从某个有偏移量的底层输入流(的Reader包装)读取,ReadAt方法既不应影响底层的偏移量,也不应被底层的偏移量影响。

ReadAt方法的调用者可以对同一输入流执行并行的ReadAt调用。

type ReaderAt interface {
   
	ReadAt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值