golang学习笔记:标准库path
path包提供了对文件路径的基本操作,如拼接、分割、获取基础文件名等。
常用方法
路径处理基础
// 路径清理(规范化)
path.Clean("/a//b/../c") // "/a/c"
path.Clean("./a/b/") // "a/b"// 路径连接
path.Join("a", "b", "c") // "a/b/c"
path.Join("/a", "//b", "c/") // "/a/b/c"
路径分解
filePath := "/home/user/file.txt"// 获取目录部分
path.Dir(filePath) // "/home/user"// 获取文件名部分
path.Base(filePath) // "file.txt"// 获取文件扩展名
path.Ext(filePath) // ".txt"
路径匹配
// 模式匹配(支持 * ? [字符] [^字符])
path.Match("*.go", "main.go") // true, nil
path.Match("*.go", "main.c") // false, nil
path.Match("a?c", "abc") // true, nil// 检查路径是否匹配模式
matched, _ := path.Match("src/*/file.*", "src/pkg/file.go")
// matched = true
相对路径计算
// 计算相对路径
path.Rel("/a/b", "/a/b/c/d") // "c/d", nil
path.Rel("/a/b", "/a/c") // "../c", nil
path与filepath的区别
| 特性 | path 包 | filepath 包 |
|---|---|---|
| 分隔符 | 始终使用 / | 使用操作系统分隔符 |
| 用途 | URL路径、通用路径 | 文件系统路径 |
| 跨平台 | ❌ 不处理平台差异 | ✅ 自动处理平台差异 |
| 示例 | path.Join("a", "b") | filepath.Join("a", "b") |
import ("path""path/filepath"
)// 对于URL或通用路径使用 path
urlPath := path.Join("api", "v1", "users") // "api/v1/users"// 对于文件系统路径使用 filepath
filePath := filepath.Join("dir", "file.txt") // "dir/file.txt" (Unix)// "dir\\file.txt" (Windows)
工具函数
package pathutilimport "path"// 验证路径是否安全(不包含上级目录引用)
func IsSafePath(filePath string) bool {cleaned := path.Clean(filePath)return cleaned != ".." && !path.HasPrefix(cleaned, "../")
}// 获取不带扩展名的文件名
func FileNameWithoutExt(filePath string) string {base := path.Base(filePath)ext := path.Ext(base)return base[:len(base)-len(ext)]
}// 构建URL路径
func BuildURLPath(parts ...string) string {return "/" + path.Join(parts...)
}
