io.Reader和io.Writer是Go中I/O操作的核心接口,分别用于读取和写入数据;通过实现这两个接口,可统一处理文件、网络等数据流;strings.NewReader和bytes.NewReader能从字符串或字节切片创建Reader;bytes.Buffer同时实现Reader和Writer,适合中间数据处理;io.Copy函数可高效地将数据从Reader复制到Writer,自动管理缓冲区,广泛用于文件、HTTP等场景;实际使用中需注意错误处理与EOF判断。

在Go语言中,io 包是处理输入输出操作的核心。它定义了如 Reader 和 Writer 这样的接口,被广泛用于文件、网络、缓冲等数据读写场景。掌握这些基础接口的使用,能帮助你灵活处理各种I/O任务。
Go 的 io 包中最关键的是两个接口:
Read(p []byte) (n int, err error) 方法,从数据源读取数据到字节切片中。Write(p []byte) (n int, err error) 方法,将字节切片中的数据写入目标。只要一个类型实现了这两个接口中的任意一个,就可以用统一的方式进行读写操作。
使用 strings.NewReader 或 bytes.NewReader 可以创建一个满足 io.Reader 接口的对象,方便测试或处理内存中的数据。
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"io"
"strings"
)
func main() {
reader := strings.NewReader("Hello, Go!")
buf := make([]byte, 8)
for {
n, err := reader.Read(buf)
if err == io.EOF {
break
}
fmt.Printf("读取 %d 字节: %s\n", n, buf[:n])
}
}
这段代码逐步从字符串中读取数据,每次最多读8个字节,直到遇到 io.EOF。
bytes.Buffer 同时实现了 io.Reader 和 io.Writer,非常适合中间数据处理。
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
var buf bytes.Buffer
data := []byte("Hello, World!")
n, _ := buf.Write(data)
fmt.Printf("写入 %d 字节\n", n)
// 可以直接从 Buffer 读取
result := make([]byte, 13)
buf.Read(result)
fmt.Printf("读出: %s\n", result)
}
也可以将数据写入标准输出(os.Stdout),它是一个典型的 io.Writer 实例。
最常用的技巧是使用 io.Copy(dst, src),它自动从任何 io.Reader 拷贝数据到 io.Writer,无需手动管理缓冲区。
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
r := strings.NewReader("Copy me!")
var w bytes.Buffer
io.Copy(&w, r)
fmt.Println("结果:", w.String())
}
这个函数非常高效,底层会自动分配临时缓冲区,适用于文件复制、HTTP 响应写入等场景。
基本上就这些。通过组合 io.Reader 和 io.Writer,你可以写出高度通用且可复用的代码。实际开发中,多数类型如 *os.File、*http.Response、net.Conn 都天然支持这些接口,直接传给 io.Copy 就行。不复杂但容易忽略的是错误处理和EOF判断,记得每次读取后检查 err。
以上就是Golang如何使用io读取和写入数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号