Go io包:流式数据读写
深入理解io.Reader和io.Writer接口,掌握流式处理数据的方法。 · 难度:入门 · +15XP
io包核心接口
Go的io包定义了数据流读写的基本抽象:io.Reader和io.Writer。Reader的Read方法将数据读入字节切片,返回读取字节数和错误;Writer的Write方法将数据从字节切片写出。
| 接口 | 方法 | 常见实现 |
|---|---|---|
| io.Reader | Read(p []byte) (n int, err error) | os.File, strings.Reader, bytes.Buffer |
| io.Writer | Write(p []byte) (n int, err error) | os.File, bytes.Buffer, net.Conn |
| io.Copy | Copy(dst Writer, src Reader) (int64, error) | 将数据从src复制到dst |
组合接口
io包还提供了组合接口如io.ReadWriter、io.ReadCloser等,方便声明同时具备多种能力的对象。
代码示例:使用io.Copy复制数据
package main
import (
"bytes"
"fmt"
"io"
"strings"
)
func main() {
src := strings.NewReader("Hello, Go io!")
var dst bytes.Buffer
written, err := io.Copy(&dst, src)
if err != nil {
panic(err)
}
fmt.Printf("Copied %d bytes: %s
", written, dst.String())
// 使用io.ReadAll一次性读取
src.Seek(0, 0) // 重置读取位置
data, _ := io.ReadAll(src)
fmt.Println("Read all:", string(data))
}
练习提示
实现一个UpperCaseReader,包装另一个Reader并将所有小写字母转换为大写后输出。提示:在Read方法中修改字节切片内容。