Go 用 goroutine 并发读写文件需隔离状态、合理使用 channel 和 WaitGroup,分阶段处理并控制并发数,配合 context 超时和 defer 清理资源,确保错误不中断整体流程。

使用 goroutine 并发读取多个文件
Go 的轻量级 goroutine 是实现并发读取的理想选择。每个文件读取任务可封装为一个独立函数,用 go 关键字启动。注意避免共享状态竞争,推荐为每个 goroutine 传入独立的文件路径和缓冲区。
- 用 os.Open 打开文件,配合 bufio.Scanner 或 io.ReadAll 高效读取
- 通过 channel(如 chan []byte 或 chan Result{Path, Content, Err})收集结果,主 goroutine 统一处理
- 用 sync.WaitGroup 等待所有读取完成,或直接 range channel 直到关闭
安全地并发写入多个文件
写入操作本身不冲突(只要目标路径不同),但需防范资源耗尽或错误堆积。不建议共用同一个 *os.File 写入多个内容,而应为每个文件单独打开、写入、关闭。
- 使用 os.Create 或 os.OpenFile(..., os.O_CREATE|os.O_WRONLY|os.O_TRUNC) 获取独立写入句柄
- 写入后务必调用 file.Close(),推荐用 defer 或在 goroutine 结尾显式关闭
- 对写入结果(成功/失败、写入字节数)同样通过 channel 返回,便于主逻辑校验与重试
读写组合:边读边写或读完再写
根据场景选择模式。若需“读 A → 处理 → 写 B”,适合单 goroutine 串行完成;若需“读 A/B/C → 同时处理 → 写 X/Y/Z”,则拆分为读、处理、写三组并发阶段,用 channel 管道衔接。
- 例如:启动 N 个 goroutine 读取输入文件 → 将内容发往中间 channel → M 个 goroutine 从该 channel 接收并转换 → 再发往输出 channel → 最后 N 个 goroutine 写入对应目标文件
- 用 context.Context 控制整体超时或取消,尤其在文件较大或网络存储(如 S3)场景下很重要
- 避免无限制启动 goroutine,可用带缓冲的 channel 或 worker pool(如 semaphore)控制并发数
错误处理与资源清理
并发中错误不可忽略。单个文件读写失败不应导致整个流程中断,但需记录并统计。临时文件、未关闭句柄、panic 都可能引发泄漏。
立即学习“go语言免费学习笔记(深入)”;
- 每个 goroutine 内部用 defer 确保 Close() 执行,即使发生 panic 也可借助 recover 补救(谨慎使用)
- 将错误统一发送至 error channel,主 goroutine 汇总后决定是否继续或退出
- 大文件处理时优先用流式读写(io.Copy + io.MultiWriter 等),避免一次性加载全部内容到内存










