Go-09-输入输出与文件处理
本节目标:掌握 Go 的
io.Reader/io.Writer接口体系、文件操作、bufio缓冲、encoding/*包,能独立写文件读写工具。
1. io.Reader / io.Writer 接口
Go 的 I/O 抽象:
1 | type Reader interface { |
所有 I/O 都实现这两个接口:
os.File(文件)net.Conn(网络连接)bytes.Buffer(内存缓冲区)strings.Reader(字符串)http.Request.Body、http.ResponseWriteros.Stdin、os.Stdout、os.Stderr
2. 文件读取
2.1 一次性读完(小文件)
1 | import "os" |
2.2 流式读取(大文件)
1 | f, err := os.Open("big.log") |
2.3 用 bufio.Scanner 按行读
1 | import "bufio" |
Scanner 默认缓冲区 64KB,单行太长需要调大:
1 | scanner := bufio.NewScanner(f) |
2.4 用 bufio.Reader 灵活读
1 | f, _ := os.Open("data.txt") |
3. 文件写入
3.1 一次性写
1 | err := os.WriteFile("out.txt", []byte("hello\n"), 0644) |
3.2 流式写
1 | f, err := os.Create("out.log") |
3.3 bufio.Writer 缓冲写入
直接 f.Write 是系统调用,每次都触发,用 bufio.Writer 批量写入:
1 | f, _ := os.Create("big.txt") |
4. 完整文件操作
1 | import "os" |
5. io.Copy:最常用的复制
1 | // 把 src 复制到 dst |
6. io.MultiReader / io.MultiWriter
1 | // 多个 Reader 串起来 |
7. io.Pipe:内存管道
1 | pr, pw := io.Pipe() |
8. 编码/解码(encoding/*)
8.1 JSON
1 | import "encoding/json" |
struct tag 控制 JSON 字段名:
1 | type User struct { |
8.2 XML
类似 JSON:
1 | type Note struct { |
8.3 CSV
1 | import "encoding/csv" |
9. 实战:日志文件轮转
1 | func logWithRotate(logFile string) error { |
生产用第三方:gopkg.in/natefinch/lumberjack.v2 提供完整的轮转、压缩、保留策略。
10. 实战:读取配置文件
1 | type Config struct { |
需要 gopkg.in/yaml.v3。
小结
| 包 | 用途 |
|---|---|
os |
文件/目录/权限 |
io |
Reader/Writer 接口、Copy |
bufio |
带缓冲的读写、Scanner |
io/ioutil |
已被废弃(用 os.ReadFile 等) |
path/filepath |
跨平台路径 |
encoding/json |
JSON |
encoding/xml |
XML |
encoding/csv |
CSV |
encoding/gob |
Go 二进制 |
黄金法则:
- 永远用
defer f.Close() - 大文件用
bufio缓冲 - 小文件用
os.ReadFile/os.WriteFile - 跨平台用
filepath.Join,不用+ "/" - 结构体 tag 控制序列化字段
下一节讲 goroutine、channel 和 Go 的并发模型。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/08/24/Go-09-IO与文件处理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!