小文件用os.ReadFile和os.WriteFile,大文件或流式处理必须用os.Open+bufio.Scanner或io.Copy;需严格检查错误并defer关闭文件句柄,避免内存泄漏和句柄耗尽。
小文件直接用 os.readfile 和 os.writefile,别绕弯;大文件或需逐行处理时,必须用 os.open + bufio.scanner 或 io.copy,否则容易爆内存或漏关句柄。
小文件读写:用 os.ReadFile 和 os.WriteFile 就够了
这两个函数封装了打开、读/写、关闭全过程,适合配置文件、JSON、模板等几十 KB 到几 MB 的场景。
- 必须检查
err:路径不存在会报"no such file or directory",权限不足是"permission denied",不处理就 panic -
os.ReadFile返回[]byte,转字符串用string(data),别用string([]byte)这种错误转换 -
os.WriteFile默认覆盖原文件;要追加得换os.OpenFile+os.O_APPEND - 第二个参数必须是
[]byte:传字符串要显式转,比如[]byte("hello"),不是string(someBytes)
示例:
data, err := os.ReadFile("config.json")
if err != nil {
log.Fatal(err) // 至少 fatal 或返回错误,别只 fmt.Println
}
err = os.WriteFile("output.txt", []byte("done\n"), 0644)
if err != nil {
log.Fatal(err)
}
大文件或流式处理:必须手动控制 *os.File 生命周期
读 GB 日志、复制 ZIP、边读边解密时,不能把整个文件 load 进内存。核心是:打开 → 处理 → 关闭,且 Close() 必须 defer。
- 忘记
defer f.Close()是最常见泄漏源,Linux 默认最多 1024 个打开文件,跑久后卡在"too many open files" -
io.Copy(dst, src)内部按 32KB 分块,不用自己写循环,性能和内存都稳 - 逐行读文本(如日志、CSV)优先用
bufio.NewScanner(f),它自动处理超长行截断;别用ReadString('\n')容易 panic -
os.OpenFile是底层统一入口,os.Create、os.Open都是它的封装,真正行为由 flag 控制
示例(复制大文件):
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
src, err := os.Open("large.log")
if err != nil {
log.Fatal(err)
}
defer src.Close()
dst, err := os.Create("large_copy.log")
if err != nil {
log.Fatal(err)
}
defer dst.Close()
_, err = io.Copy(dst, src)
if err != nil {
log.Fatal(err)
}
os.OpenFile 的 flag 组合决定实际行为
所有“能不能写”“找不到是否创建”“是否清空”“是否追加”都靠 flag 参数控制,不是函数名决定的。
-
os.O_RDONLY:只读,文件必须存在,否则报错 -
os.O_WRONLY | os.O_CREATE | os.O_TRUNC:写入,不存在则创建,存在则清空 -
os.O_WRONLY | os.O_CREATE | os.O_APPEND:追加,不存在则创建,存在则末尾写 - 权限第三参数是 Unix 风格 mode,
0644表示rw-r--r--,Windows 上会被忽略但建议保留
示例(安全追加日志):
f, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
defer f.Close()
_, _ = f.WriteString("info: started\n")
真正容易被忽略的不是语法,而是错误分支的处理粒度和 Close() 的时机——defer 看似简单,但在多层 return 或 panic 时,它只保证函数退出时执行,中间出错仍可能跳过。复杂流程建议把文件操作封装进单独函数,让 defer 作用域更可控。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










