path
该模块主要用于处理以/分隔的路径。
Base
该方法返回一个路径的最后一部分,例如:
fmt.Println(path.Base(""))       // .
fmt.Println(path.Base("/"))      // /
fmt.Println(path.Base("a/b/c"))  // c
fmt.Println(path.Base("a/b/c/")) // c
源码如下:
func Base(path string) string {
    if path == "" {
        return "."
    }
    // Strip trailing slashes.
    for len(path) > 0 && path[len(path)-1] == '/' {
        path = path[0 : len(path)-1]
    }
    // Find the last element
    if i := strings.LastIndex(path, "/"); i >= 0 {
        path = path[i+1:]
    }
    // If empty now, it had only slashes.
    if path == "" {
        return "/"
    }
    return path
}
总的来说,遵循如下规则:
- 如果参数是空字符处串,返回.
- 如果参数是/,返回/
- 其它情况,去掉末尾的/,然后返回最后一个/后面的部分
Clean
该方法返回一个路径的简洁形式,即会将.,..以及多余的/进行解析。例如:
fmt.Println(path.Clean("/a/b//c/../d/")) // /a/b/d
fmt.Println(path.Clean("../a/b//./c"))   // ../a/b/c
IsABbs
判断是否为绝对路径:
func IsAbs(path string) bool {
    return len(path) > 0 && path[0] == '/'
}
例如:
fmt.Println(path.IsAbs("/a/b/c")) // true
fmt.Println(path.IsAbs("a/b/c"))  // false
Join
该方法会将多个片段连起来,然后使用Clean操作:
func Join(elem ...string) string {
    for i, e := range elem {
        if e != "" {
            return Clean(strings.Join(elem[i:], "/"))
        }
    }
    return ""
}
例如:
fmt.Println(path.Join("a", "b", "c"))          // a/b/c
fmt.Println(path.Join("a", "/b", "../c", "d")) // a/c/d
Split
该方法根据最后一个/将路径分为两部分:
func Split(path string) (dir, file string) {
    i := strings.LastIndex(path, "/")
    return path[:i+1], path[i+1:]
}
例如:
fmt.Println(path.Split("a/b/c"))  // "a/b/", "c"
fmt.Println(path.Split("a/b/c/")) // "a/b/c/", ""
fmt.Println(path.Split(""))       // "", ""
fmt.Println(path.Split("/"))      // "/", ""
fmt.Println(path.Split("a"))      // "", "a"
Dir
该方法返回一个路径的目录部分,实际上就是Split操作返回值的第一部分:
func Dir(path string) string {
    dir, _ := Split(path)
    return Clean(dir)
}
Ext
该方法返回路径所表示文件的扩展名,例如:
fmt.Println(path.Ext("a/b/c"))     // ""
fmt.Println(path.Ext("a/b/c.txt")) // .txt
Match
该方法用于路径的模式匹配,例如:
fmt.Println(path.Match("test/*", "test/ab"))  // true <nil>