Go文件操作无独立“保存”动作,写入后必须调用Close()才落盘;os.Create等价于os.OpenFile(...O_RDWR|O_CREATE|O_TRUNC, 0644),会清空文件;os.OpenFile更灵活,支持追加、只读、不覆盖等模式。

Go 里写文件不是“创建→写→保存”三步走,而是“打开/创建→写入→关闭”,没有独立的“保存”动作——写入缓冲区后调用 Close() 才真正落盘,漏关或不显式刷新容易丢数据。
用 os.Create() 还是 os.OpenFile()?
二者本质都是调用 os.OpenFile(),但语义和默认行为不同:
-
os.Create()等价于os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644),会清空已有内容,适合全新写入 -
os.OpenFile()更灵活:追加用os.O_APPEND,只读用os.O_RDONLY,不覆盖存在文件用os.O_EXCL - 常见错误:
os.Create()遇到只读目录直接 panic;os.OpenFile()返回error可捕获处理
写入时要不要用 bufio.Writer?
小文件(*os.File 没问题;大文件或高频写入必须套 bufio.Writer,否则系统调用过多、性能暴跌:
- 默认缓冲区 4KB,调用
Write()只写入缓冲区,不立即发 syscall - 必须显式调用
Flush()或Close()(后者会自动Flush)才能确保数据写入磁盘 - 错误示例:
w := bufio.NewWriter(f); w.Write([]byte("hello")); // 忘 flush → 文件可能为空
为什么文件写完了却看不到内容?
典型原因就三个:
立即学习“go语言免费学习笔记(深入)”;
- 忘记
Close()或Flush():缓冲区未刷出,进程退出前可能丢失数据 - 权限问题:Linux/macOS 下
os.Create()默认0644,若父目录无写权限,创建失败但错误被忽略 - 路径错误:相对路径基于当前工作目录(
os.Getwd()),不是源文件所在目录;建议用绝对路径或显式拼接:filepath.Join(dir, "out.txt")
最简可靠写法:用 defer f.Close() 保底,写完立刻 Close() 触发 flush,别依赖 GC —— 它不保证何时回收文件句柄。


















