在Go语言开发中,io包是处理输入输出操作的核心标准库。它定义了Reader和Writer等基础接口,让不同类型的数据源和数据目标可以用统一的方式被读写。无论是操作文件、网络请求还是内存缓冲,都能基于io包提供的抽象来实现。

io包的核心接口
io.Reader和io.Writer是两个最基础的接口。Reader只有一个Read方法,用于把数据读入字节切片;Writer只有一个Write方法,用于把字节切片里的数据写出去。任何实现了这两个方法的类型,都可以当作读写器使用。
Reader接口定义
type Reader interface {
Read(p []byte) (n int, err error)
}
Writer接口定义
type Writer interface {
Write(p []byte) (n int, err error)
}
从字符串读取数据
可以使用strings.NewReader创建一个内存中的读取器,它实现了io.Reader接口。下面的例子展示了如何循环调用Read方法把内容读出来。
package main
import (
"fmt"
"io"
"strings"
)
func main() {
// 创建一个字符串读取器
r := strings.NewReader("你好,Golang的io包")
buf := make([]byte, 8)
for {
n, err := r.Read(buf)
if n > 0 {
fmt.Print(string(buf[:n]))
}
if err == io.EOF {
break
}
if err != nil {
fmt.Println("读取错误:", err)
break
}
}
}
写入数据到缓冲区
bytes.Buffer实现了io.Writer接口,常用来在内存中累积数据。下面演示如何把字符串写入缓冲并取回结果。
package main
import (
"bytes"
"fmt"
)
func main() {
var w bytes.Buffer
// 写入字符串内容
w.Write([]byte("使用io.Writer写入数据"))
fmt.Println(w.String())
}
使用io.Copy简化读写
当需要将一个Reader的数据复制到Writer时,不需要自己写循环,直接调用io.Copy即可。下面的代码把字符串读取器的内容写到标准输出。
package main
import (
"io"
"os"
"strings"
)
func main() {
r := strings.NewReader("通过io.Copy输出这段文字")
// 将r的内容复制到标准输出
_, err := io.Copy(os.Stdout, r)
if err != nil {
panic(err)
}
}
文件拷贝实践
io.Copy也常用于文件操作。下面示例打开一个源文件并把内容拷贝到目标文件,展示了实际项目中常见的读写流程。
package main
import (
"io"
"os"
)
func main() {
src, err := os.Open("source.txt")
if err != nil {
panic(err)
}
defer src.Close()
dst, err := os.Create("target.txt")
if err != nil {
panic(err)
}
defer dst.Close()
// 执行文件拷贝
_, err = io.Copy(dst, src)
if err != nil {
panic(err)
}
}
小结
通过上面的示例可以看到,Golang的io包用极简的接口统一了各类读写场景。掌握Reader、Writer以及io.Copy等工具,能让你在处理流式数据时写出更通用、更干净的代码。