先看标准库

作用:关于路径的一些实用操作

 https://github.com/golang/go/blob/master/src/path/path.go 源码地址

func IsAbs

func IsAbs(path string) bool

IsAbs返回路径是否是一个绝对路径。

源码如下:

func IsAbs(path string) bool {
	return len(path) > 0 && path[0] == '/'
}

非常简单,return 了个bool , 判断条件是path大于零并且绝对路径是以‘/’开头。

func Split

func Split(path string) (dir, file string)

Split函数将路径从最后一个斜杠后面位置分隔为两个部分(dir和file)并返回。如果路径中没有斜杠,函数返回值dir会设为空字符串,file会设为path。两个返回值满足path == dir+file。

源码如下:

func Split(path string) (dir, file string) {
    i := strings.LastIndex(path, "/")
    return path[:i+1], path[i+1:]
}

也很简单和官方给的函数介绍一样,LastIndex找到最后一个“/”匹配成功的位置,找不到i == -1 。

func Join

func Join(elem ...string) string

Join函数可以将任意数量的路径元素放入一个单一路径里,会根据需要添加斜杠。结果是经过简化的,所有的空字符串元素会被忽略。

func Join(elem ...string) string {
    for i, e := range elem {
        if e != "" {
            return Clean(strings.Join(elem[i:], "/"))
        }
    }
    return ""
}

输入的elem是slice通过strings.Join 用“/”连接起来,再用Clean清理不必要的字符。

func Dir

func Dir(path string) string

Dir返回路径除去最后一个路径元素的部分,即该路径最后一个元素所在的目录。在使用Split去掉最后一个元素后,会简化路径并去掉末尾的斜杠。如果路径是空字符串,会返回".";如果路径由1到多个斜杠后跟0到多个非斜杠字符组成,会返回"/";其他任何情况下都不会返回以斜杠结尾的路径。

func Dir(path string) string {
    dir, _ := Split(path)
    return Clean(dir)
}

这也很简单没啥好说的 最后用Clean 清理了不必要的“/”

func Base

func Base(path string) string

Base函数返回路径的最后一个元素。在提取元素前会求掉末尾的斜杠。如果路径是"",会返回".";如果路径是只有一个斜杆构成,会返回"/"。

 1 func Base(path string) string {
 2     if path == "" {
 3         return "."
 4     }
 5     // Strip trailing slashes.
 6     for len(path) > 0 && path[len(path)-1] == '/' {
 7         path = path[0 : len(path)-1]
 8     }
 9     // Find the last element
10     if i := strings.LastIndex(path, "/"); i >= 0 {
11         path = path[i+1:]
12     }
13     // If empty now, it had only slashes.
14     if path == "" {
15         return "/"
16     }
17     return path
18 }

行2 判断地址是否为空

行3当地址长度大于0 并且地址尾部是“/”时去除尾部“/”

行10 将末尾的元素给path

func Ext

func Ext(path string) string

Ext函数返回path文件扩展名。返回值是路径最后一个斜杠分隔出的路径元素的最后一个'.'起始的后缀(包括'.')。如果该元素没有'.'会返回空字符串。

1 func Ext(path string) string {
2     for i := len(path) - 1; i >= 0 && path[i] != '/'; i-- {
3         if path[i] == '.' {
4             return path[i:]
5         }
6     }
7     return ""
8 }

文件扩展名在"."之后,行2循环找到.的位置i 返回i后面的元素,找不到返回空字符串

func Clean

func Clean(path string) string

Clean函数通过单纯的词法操作返回和path代表同一地址的最短路径。

它会不断的依次应用如下的规则,直到不能再进行任何处理:

1. 将连续的多个斜杠替换为单个斜杠
2. 剔除每一个.路径名元素(代表当前目录)
3. 剔除每一个路径内的..路径名元素(代表父目录)和它前面的非..路径名元素
4. 剔除开始一个根路径的..路径名元素,即将路径开始处的"/.."替换为"/"

只有路径代表根地址"/"时才会以斜杠结尾。如果处理的结果是空字符串,Clean会返回"."。

clean源码好复杂我也没细看,主要就是去除多余的“/”等

func Match

func Match(pattern, name string) (matched bool, err error)

如果name匹配shell文件名模式匹配字符串,Match函数返回真。

Match就是路径模式匹配详看标准库。 

01-13 20:36