io基础库
Go语言的io包提供了基本的接口来读取和写入数据。这个包包括了对不同数据源(如文件、网络连接、管道等)的读写操作的支持。以下是io包的一些常用接口和场景用例:
1. 基本读写操作
io包提供了io.Reader和io.Writer接口,它们是许多其他接口(如io.ReaderAt、io.ReaderFrom、io.WriterTo等)的基础。
用法示例:
// 假设我们有一个实现了io.Reader接口的r和一个实现了io.Writer接口的w
n, err := io.Copy(w, r) // 从r读取数据并写入w
2. 读写文件
os.Open函数可以用来打开文件,返回一个*os.File类型的对象,这个对象实现了io.Reader和io.Writer接口。
用法示例:
file, err := os.Open("example.txt")
if err != nil {
// 错误处理
}
defer file.Close()
// 读取文件
data := make([]byte, 1024)
n, err := file.Read(data)
// 处理读取的数据
3. 缓冲读写
bufio是io包的一个子包,提供了带缓冲的读写操作,可以提高读写效率。
用法示例:
file, err := os.Open("example.txt")
if err != nil {
// 错误处理
}
defer file.Close()
reader := bufio.NewReader(file)
line, err := reader.ReadString('\n') // 处理读取的行
4. 数据复制
io.Copy函数可以用来复制数据从一个io.Reader到一个io.Writer。
用法示例:
source, err := os.Open("source.txt")
if err != nil {
// 错误处理
}
defer source.Close()
destination, err := os.Create("destination.txt")
if err != nil {
// 错误处理
}
defer destination.Close()
// 复制数据
io.Copy(destination, source)
5. 读取直到特定字符或字符串
bufio包的ReadString方法可以读取直到特定字符或字符串出现。
用法示例:
reader := bufio.NewReader(os.Stdin)
line, err := reader.ReadString('\n') // 读取用户输入的一行,直到换行符
6. 多路复用读写
io包的io.MultiReader和io.MultiWriter可以组合多个Reader或Writer。
用法示例:
// 创建两个字符串reader
r1 := strings.NewReader("Hello, ")
r2 := strings.NewReader("World!")
// 使用MultiReader组合它们
reader := io.MultiReader(r1, r2)
// 从组合的reader中读取数据
buf := make([]byte, 1024)
n, err := reader.Read(buf)
if err != nil {
fmt.Println("Error reading from MultiReader:", err)
return
}
fmt.Println(string(buf[:n])) // 输出 "Hello, World!"
例二:
// 创建两个writer,一个写入文件,一个写入标准输出
file, err := os.Create("output.txt")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
writer := io.MultiWriter(file, os.Stdout)
// 写入数据到MultiWriter,数据会被复制到每个Writer
_, err = writer.Write([]byte("Hello, World!"))
if err != nil {
fmt.Println("Error writing to MultiWriter:", err)
return
}
7. 限制读写操作
ioutil包(在Go 1.16中被标记为废弃,推荐使用os和io包代替)提供了ReadAll和WriteString等函数,可以一次性读取或写入所有数据。
用法示例:
data, err := ioutil.ReadAll(reader) // 读取reader中的所有数据
场景用例
- 文件读写:读取和写入文件数据,例如处理日志文件、配置文件等。
- 网络通信:通过网络连接读写数据,如HTTP服务器和客户端的实现。
- 数据转换:将一种数据格式转换为另一种格式,例如将JSON转换为XML。
- 命令行工具:在命令行工具中读取用户输入或写入输出。
- 数据处理:对数据进行过滤、排序或聚合操作,如数据分析和处理。
- 数据管道:在复杂的数据处理流程中,使用管道(pipe)来传输数据。
- 测试和模拟:在单元测试中模拟文件操作或网络连接。
io包是Go语言中处理I/O操作的基础,通过实现io.Reader和io.Writer接口,可以轻松地实现自定义的读写逻辑,以适应不同的应用场景。