Go 语言中的 io 包提供了基本的 I/O 接口和功能,主要用于抽象底层操作系统提供的 I/O 原语。以下是 io 包中的主要内容及其简要总结:
常量
- SeekStart: 从文件开头开始
- SeekCurrent: 从当前位置开始
- SeekEnd: 从文件末尾开始
错误变量
- ErrShortWrite: 写操作未写入所有字节
- ErrInvalidWrite: 写入结果无效
- ErrShortBuffer: 缓冲区太短
- EOF: 读取到文件末尾
- ErrUnexpectedEOF: 读取时意外遇到 EOF
- ErrNoProgress: 多次读取没有进展
主要接口
- Reader: 读取数据
- Writer: 写入数据
- Closer: 关闭资源
- Seeker: 定位读取/写入位置
组合接口
- ReadWriter: 包含
Reader和Writer - ReadCloser: 包含
Reader和Closer - WriteCloser: 包含
Writer和Closer - ReadWriteCloser: 包含
Reader、Writer和Closer - ReadSeeker: 包含
Reader和Seeker - ReadSeekCloser: 包含
Reader、Seeker和Closer - WriteSeeker: 包含
Writer和Seeker - ReadWriteSeeker: 包含
Reader、Writer和Seeker
特殊接口
- ReaderFrom: 从另一个
Reader读取数据 - WriterTo: 写数据到另一个
Writer - ReaderAt: 从指定位置读取数据
- WriterAt: 在指定位置写入数据
- ByteReader: 读取单个字节
- ByteWriter: 写入单个字节
- RuneReader: 读取单个 Unicode 字符
- StringWriter: 写入字符串
辅助函数
- ReadAtLeast: 从
Reader读取至少指定字节数 - ReadFull: 读取固定长度的数据
- CopyN: 复制指定字节数
- Copy: 复制数据直到 EOF 或错误
- CopyBuffer: 使用指定缓冲区复制数据
- LimitReader: 限制读取数据的字节数
- NewSectionReader: 创建一个在指定区间读取的
Reader - TeeReader: 同时读取和写入数据
- Discard: 丢弃写入的数据
- NopCloser: 创建一个不做任何操作的
Close方法的Reader - ReadAll: 读取所有数据到内存
示例代码
package main
import (
"io"
"os"
)
func main() {
// 读取文件示例
file, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
buf := make([]byte, 1024)
n, err := file.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
// 写入文件示例
fileOut, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer fileOut.Close()
_, err = fileOut.Write(buf[:n])
if err != nil {
panic(err)
}
}
记忆总结
- 常用接口:
Reader,Writer,Closer,Seeker - 常用函数:
Copy,ReadAll,ReadFull - 常见错误:
EOF,ErrShortWrite,ErrUnexpectedEOF