在 go 中,使用 os.mkdirall(path, perm) 可以简洁、安全、幂等地递归创建任意深度的目录结构,若路径已存在则静默成功,完全符合 -p 语义。
Go 标准库提供了高度惯用且健壮的解决方案:os.MkdirAll。它专为“递归创建目录”这一常见需求设计,行为与 Bash 的 mkdir -p、C# 的 Directory.CreateDirectory、PHP 的 mkdir(..., ..., true) 和 Java 的 File.mkdirs() 高度一致——即自动创建所有缺失的父目录,并在目标路径已存在(无论为目录还是符号链接)时返回 nil,不报错、不覆盖、不干扰。
package main
import (
"fmt"
"os"
)
func main() {
path := "some/deep/nested/path"
// 创建整个路径,权限设为 0755(Unix/Linux/macOS)
err := os.MkdirAll(path, 0755)
if err != nil {
fmt.Printf("创建目录失败: %v\n", err)
return
}
fmt.Printf("目录 '%s' 已就绪\n", path)
}✅ 关键特性说明: os.MkdirAll 会逐级检查并创建 some → some/deep → some/deep/nested → some/deep/nested/path; 所有新建目录均使用同一权限 perm(Windows 上权限位会被忽略,但调用仍合法); 若 path 已是目录(或符号链接指向目录),函数立即返回 nil; 若中间某级是普通文件(而非目录),则返回 *os.PathError,错误信息明确指出“not a directory”。
os.Stat 预检 + 显式清理逻辑。 os.MkdirAll 是 Go 生态中创建嵌套目录的唯一推荐标准方案。它简洁、幂等、跨平台、语义清晰,完美匹配现代编程中对“确保路径存在”的通用需求。摒弃手动遍历 filepath.Dir 或循环调用 os.Mkdir 的冗余实现——拥抱标准库,写出更地道、更可靠的 Go 代码。