应使用os.tempdir()而非硬编码路径或手动读环境变量,因其已跨平台封装tmpdir/temp/userprofile等逻辑、做路径验证并返回规范绝对路径;硬编码"/tmp"在windows失败,手动读取环境变量则忽略fallback、权限与规范化。

直接用 os.TempDir(),别自己拼路径或读环境变量——它已自动处理跨平台逻辑,且行为稳定。
为什么不能手动拼 /tmp 或读 TMP 环境变量
硬编码路径(如 "/tmp")在 Windows 上会立即失败;而直接读 os.Getenv("TMP") 忽略了 TEMP 的 fallback 逻辑、权限校验和路径规范化。Go 的 os.TempDir() 内部已封装这些细节:
• 在 Linux/macOS 上优先取 TMPDIR,未设置则用 /tmp
• 在 Windows 上按顺序检查 USERPROFILE、TEMP、TMP,并做路径有效性验证
• 返回值始终是绝对路径,末尾不带斜杠,可直接传给 os.CreateTemp 或 os.MkdirTemp
os.TempDir() 和 os.Getwd() 完全不是一回事
新手常混淆这两个函数:
• os.TempDir() 返回系统级临时目录(如 /tmp 或 C:\Users\XXX\AppData\Local\Temp),与当前工作目录无关
• os.Getwd() 返回进程启动时所在目录(即 pwd),可能是个项目根目录,也可能是个空文件夹,完全不适合作为临时文件存放地
• 若你在 CLI 工具里需要“相对当前目录的临时子目录”,应先调 os.Getwd(),再用 filepath.Join(wd, ".tmp") 拼接,但注意:这不属于系统临时目录,也不受系统清理策略保护
创建临时文件/目录时,os.TempDir() 应该传给谁
os.TempDir() 的典型用途是作为 os.CreateTemp() 和 os.MkdirTemp() 的第一个参数:
• 正确:os.CreateTemp(os.TempDir(), "myapp-*.log")
• 错误:os.CreateTemp("", "myapp-*.log") —— 虽然也能工作(空字符串会 fallback 到 os.TempDir()),但语义模糊,且 IDE 或静态检查工具可能报 warning
• 更安全的做法是显式传入:os.MkdirTemp(os.TempDir(), "cache-*"),避免依赖隐式行为
• 不要把它和 filepath.Join(os.TempDir(), "subdir") 混用后直接 os.MkdirAll()——这样创建的目录没有唯一性保障,多进程并发时可能冲突
真正容易被忽略的是:临时目录本身可能不可写(比如容器里挂载了只读 /tmp),os.TempDir() 不会校验写权限,错误只会在后续 CreateTemp 时暴露。所以生产代码中,如果对临时 IO 有强依赖,应在初始化阶段主动尝试创建并删除一个测试文件,而非等到业务逻辑里才 panic。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











