注册 登录

清河洛

Go的io标准库

qingheluo2024-07-02清河洛298
io包为I/O原语提供基本接口,将这些原语的现有实现包装到实现了抽象功能的接口中,实现了多系统的兼容官方特别注明,这些实现对于并行执行不一定安全常用的预定义错误 EOF 当没有更多输入时Read的返回 ErrClosedPipe 对封闭管道进行读或写操作 ErrShortBuffer 读取需要比提供的缓冲区更长的缓冲区 ErrShortWrite 写入接受的字节数少于请求的字节数 常用接口和结构体为了简化文章字符,以下接口或结构体的定义省略type和interface|struct关闭接口 Closer { Close() error } 读写偏...

io包为I/O原语提供基本接口,将这些原语的现有实现包装到实现了抽象功能的接口中,实现了多系统的兼容

官方特别注明,这些实现对于并行执行不一定安全

常用的预定义错误

EOF              当没有更多输入时Read的返回
ErrClosedPipe    对封闭管道进行读或写操作
ErrShortBuffer   读取需要比提供的缓冲区更长的缓冲区
ErrShortWrite    写入接受的字节数少于请求的字节数

常用接口和结构体

为了简化文章字符,以下接口或结构体的定义省略type和interface|struct

关闭接口

Closer { Close() error }

读写偏移量接口

Seeker { Seek(offset int64, whence int) (int64, error) }
    下一次读或写的位置偏移量设置为offset
    whence表示相对于文件什么位置计算偏移量,值为预定于常量
        io.SeekStart  =0  表示文件开头
        io.SeekCurrent=1  表示当前位置
        io.SeekEnd    =2  表示文件末尾
    返回读或写操作后相对于文件开头的偏移量和错误

读相关

接口
Reader   { Read  (p []byte) (n int, err error) }
    读取len(p)字节的数据并写入到p,将返回读取的字节数
ReaderAt { ReadAt(p []byte, off int64) (n int, err error) }
    从off偏移量读取len(p)字节的数据并写入到p,将返回读取的字节数
ReaderFrom { ReadFrom(r Reader) (n int64, err error) }
    从r读取数据并返回读取的字节数
RuneReader { ReadRune() (r rune, size int, err error) }
    每次执行读取单个编码的Unicode字符,并返回该字符及其字节大小
ByteReader { ReadByte() (byte, error) }
    每次执行读取并返回下一个字节

结构体
LimitedReader{
    R Reader
    N int64
}
    Read(p []byte) (n int, err error) :每次Read()都会更新N值,当N<=0是返回EOF

PipeReader struct { }
    Close()
    CloseWithError(err error)  关闭管道的读,后续读操作返回指定的err而不是ErrClosedPipe
    Read(data []byte) (n int, err error) 从管道读取,阻塞直到读取大小为len(data)或写入端关闭

写相关

接口
Writer   { Write (p []byte) (n int, err error) }
    将p的len(p)个字节数据写入数据流,返回写入的字节数
WriterAt { WriteAt(p []byte, off int64) (n int, err error) }
    将p的len(p)个字节数据从off偏移量开始写入数据流,返回写入的字节数
WriterTo { WriteTo(w Writer) (n int64, err error) }
    将数据写入w直到没有更多的数据或发生错误,返回写入的字节数
StringWriter { WriteString(s string) (n int, err error) }
    将字符串s的内容写入数据流,返回写入的字节数
ByteWriter { WriteByte(c byte) error }
    写入指定的一个字节

结构体
OffsetWriter{ }  从指定偏移量的位置开始写入
    使用io.NewOffsetWriter(w WriterAt, off int64) *OffsetWriter创建
    Seek(offset int64, whence int) (int64, error)
    Write(p []byte) (n int, err error)
    WriteAt(p []byte, off int64) (n int, err error)

PipeWriter struct { }
    Close()
    CloseWithError(err error)  关闭管道的写,后续写操作返回指定的err而不是ErrClosedPipe
    Write(data []byte) (n int, err error) 将数据写入管道,阻塞直到读取器读取了所有数据或读取端关闭

读写等整合相关

根据名称就可以看出来,是将上面的接口或结构体进行了整合

ReadCloser :整合了Reader和Closer
    NopCloser(r Reader) ReadCloser
ReadSeekCloser :整合了Reader、Seeker和Closer
ReadSeeker
ReadWriteCloser
ReadWriteSeeker
ReadWriter
WriteCloser
WriteSeeker

包的导出方法

Copy(dst Writer, src Reader) (written int64, err error)
    将数据从src复制到dst,返回复制的字节数

CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
    与Copy相同,只是它通过指定的缓冲区执行,而不是分配临时缓冲区
    如果buf为nil,则自动分配一个
    如果buf的长度为零,则会死机

CopyN(dst Writer, src Reader, n int64) (written int64, err error)
    将n个字节从src复制到dst,返回复制的字节数

Pipe() (*PipeReader, *PipeWriter)
    创建内存同步管道
    管道上的读和写是匹配的。每次写入都会阻塞,直到一个或多个对写入数据的读取将数据读取完毕
    相当于数据直接从Write复制到相应的Read而没有内部缓冲

ReadAll(r Reader) ([]byte, error)
    从r读取全部数据,并返回读取的数据

ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
    从r读取数据到buf,直到它至少读取了min字节或遇到EOF错误
    返回复制的字节数,如果读取的字节较少,则返回错误。仅当未读取字节时,错误才会被删除

ReadFull(r Reader, buf []byte) (n int, err error)
    从r中读取len(buf)字节数据到buf,返回复制的字节数

WriteString(w Writer, s string) (n int, err error)
    将字符串s的内容写入w,返回写入字节数


网址导航