必须显式清理临时文件和目录,无自动回收;os.CreateTemp需传含单的pattern(如"log-.txt”)、Go1.19+用三参数指定权限(0644),目录用os.RemoveAll递归删除,测试中优先t.TempDir()自动清理。

Go 里创建临时文件或目录,**必须显式清理,没有自动回收机制**。别指望系统或 runtime 帮你删,不手动 os.Remove 或 os.RemoveAll,它们就一直躺在磁盘上——测试跑十次,就留十个残留文件。
用 os.CreateTemp 创建临时文件时权限和命名怎么设才安全
Go 1.16+ 应该只用 os.CreateTemp,ioutil.TempFile 已弃用。它比拼接时间戳或随机数可靠得多,底层靠原子创建(O_EXCL)防冲突。
-
dir参数传"",让os.TempDir()自动选系统默认路径(尊重TMPDIR/TEMP环境变量),别硬写/tmp或C:\Temp -
pattern必须含且仅含一个*,例如"log-*.txt"✅,"log.txt"❌(报invalid pattern),"log-*.json.*"❌(多个*) - 权限要一次性指定:Go 1.19+ 支持三参数版本
os.CreateTemp("", "data-*.bin", 0644);旧版本只能事后os.Chmod,但存在竞态窗口 - Windows 下文件被打开时
os.Remove会失败,务必先file.Close()再删
用 os.MkdirTemp 创建临时目录后为什么 os.Remove 不行
os.Remove 只能删空目录,而临时目录通常写入了文件。直接调用会返回 directory not empty 错误。
- 必须用
os.RemoveAll递归删除整棵树 -
pattern中的*必须在末尾,如"myapp-*",否则某些系统(尤其是 Windows)会拒绝创建 - 权限参数(如
0755)要用八进制字面量写法,0755✅,755❌(那是十进制,实际权限错乱) - Windows 忽略
perm参数,目录权限继承父目录;如需强控制,创建后补一句os.Chmod(dir, 0700)
测试中怎么避免每次手写 defer os.RemoveAll
在 *testing.T 里,优先用内置机制,省去手动清理逻辑,也规避 panic 时 defer 不执行的风险。
- 单个临时目录:直接用
t.TempDir(),测试结束自动删,连t.Cleanup都不用注册 - 需要临时文件?在
t.TempDir()下用os.Create或os.WriteFile,路径天然隔离 - 若必须用
os.CreateTemp(比如要控制权限或文件句柄),搭配t.Cleanup:t.Cleanup(func() { os.Remove(f.Name()) }) - 注意:
t.TempDir()返回的是绝对路径,且保证为空;不要把它和os.MkdirTemp混用
最易忽略的一点:临时文件写入中途出错(比如 Write 失败、Sync 报 ENOSPC),文件已创建但没被删——所有可能提前 return 的分支,都要覆盖清理逻辑,不能只依赖入口处的一个 defer。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











