Golang标准库——io

本文解析了Go语言io包中的Error类型、关键接口(如Reader、Writer、Closer等)、常用函数(如ReadAtLeast、ReadFull等)以及重要结构体如LimitedReader。涵盖了基础I/O操作和错误处理的高级用法。

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

io包中的源码都是BSD风格的。

1、io包中定义的error

// ErrShortWrite 当读取的字节不能满足需要的字节数时,就会返回该错误
var ErrShortWrite = errors.New("short write")

// errInvalidWrite 意味着返回一个不可能的字节数
var errInvalidWrite = errors.New("invalid write result")

// ErrShortBuffer 提供的缓冲区太小
var ErrShortBuffer = errors.New("short buffer")

// EOF当无法得到更多输入时,Read方法返回EOF。当函数一切正常的到达输入的结束时,就应返回EOF。
// 如果在一个结构化数据流中EOF在不期望的位置出现了,则应返回错误ErrUnexpectedEOF或者其它给出更多细节的错误。
var EOF = errors.New("EOF")
 
// ErrUnexpectedEOF 意味着EOF出现在了一个固定大小的块或者数据结构的中间位置
// 也就是文件没有读到结尾就出现了EOF
var ErrUnexpectedEOF = errors.New("unexpected EOF")

// 某些使用io.Reader接口的客户端如果多次调用Read都不返回数据也不返回错误时,就会返回本错误,
// 一般来说是io.Reader的实现有问题的标志。
var ErrNoProgress = errors.New("multiple Read calls return no data or error")

2、io包中的接口

2.1 Reader

Reader是一个包装了基本读方法的接口。

Read方法读取len§字节的数据到p中,它返回读取到的字节数和任何发生的错误。即使Read方法返回值n < len§,本方法在被调用时仍可能使用p的全部长度作为暂存空间。如果有部分可用数据,但不够len§字节,Read按惯例会返回可以读取到的数据,而不是等待更多数据。

Read 参数和返回值:

  • p:缓冲区
  • n:读取的字节数 0 <= n <= len§
  • err:错误
type Reader interface {
   
   
	Read(p []byte) (n int, err error)
}

2.2 Writer

Writer是一个包装了基本写方法的接口。

Write将len§个字节从p中写入底层数据流,返回写入的字节数和发生的任何导致写入提前停止的错误。如果写入的字节数小于len§它一定会返回一个非nil的错误。Writer一定不会修改传入的切片的数据。

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

2.3 Closer

Closer是一个包装了基本关闭方法的接口。例如:关闭文件。关闭socket

type Closer interface {
   
   
	Close() error
}

2.4 Seeker

Seeker是一个包装了基本移位方法的接口。

Seek方法设定下一次读写的位置:偏移量为offset。Seek返回相对于文件的开始的新的偏移量和任何发生的错误。

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

const (
	SeekStart   = 0 // 相对于文件开始位置
	SeekCurrent = 1 // 相对于指针当前位置
	SeekEnd     = 2 // 相当于文件结尾的位置
)

2.5 ReaderFrom

ReadFrom从一个Reader中读取数据直到读完或者发生错误,返回值n为读取到的字节数。

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

2.6 WriterTo

WriteTo向一个Writer中写入数据,直到数据全部写完或者发生错误。

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

2.7 ReaderAt

ReaderAt与Reader差不多,它可以指定读取的位置的偏移量。

type ReaderAt interface {
   
   
	ReadAt(p []byte, off int64
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值