golang的path

Posted 宜技之长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang的path相关的知识,希望对你有一定的参考价值。

简述

path 包实现了一系列实用函数, 这些函数可以对实用斜杠进行分隔的路径进行处理。

函数

func Base(path string) string

返回路径的最后一个元素。

在提取最后一个元素之前, 路径末尾的斜杠会被移除。

如果路径为空, 那么返回 “.” 。 如果路径只由斜杠组成, 那么返回 “/” 。
示例

package main
import (
    "fmt"
    "path"
)
func main() {
    fmt.Println("结果", path.Base("/a/b/c"))
}
// 结果 c
func Clean(path string) string

通过纯粹的词法处理, 返回一个等价于 path 的最短路径。 Clean 函数会根据以下规则进行迭代, 直到没有任何规则可以应用为止:

使用单个斜杠代替多个斜杠。
移除所有 . 路径名元素(当前目录)
移除所有内含的 .. 路径名元素(父目录),以及先于它的非 .. 元素。
移除所有以根路径方式存在的 .. 元素,也即是,使用 “/” 去替换路径开头的 “/..”
只有在 path 为根目录 “/” 的时候, 函数才会返回 “/” 。

如果函数的处理结果是一个空字符串, 那么它将返回字符串 “.” 作为结果。

package main

import (
    "fmt"
    "path"
)

func main() {
    paths := []string{
        "a/c",
        "a//c",
        "a/c/.",
        "a/c/b/..",
        "/../a/c",
        "/../a/b/../././/c",
        "",
    }

    for _, p := range paths {
        fmt.Printf("Clean(%q) = %q\n", p, path.Clean(p))
    }

}
//结果
//Clean("a/c") = "a/c"
//Clean("a//c") = "a/c"
//Clean("a/c/.") = "a/c"
//Clean("a/c/b/..") = "a/c"
//Clean("/../a/c") = "/a/c"
//Clean("/../a/b/../././/c") = "/a/c"
//Clean("") = "."
func Dir(path string) string

返回路径里面除最后一个元素之外的其他所有元素, 通常为路径的目录。

在使用 Split 丢弃最后一个元素之后, 路径将是清洁的(Cleaned), 并且所有末尾的斜杠都将被移除。

如果路径为空, 那么函数将返回 “.” 作为结果。

如果路径由任意多个斜杠后跟任意多个非斜杠字节组成(比如 //////qqq), 那么函数将返回单个斜杠。 在其他情况下, 函数返回的路径都不会以斜杠结束。

示例:

package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(path.Dir("/a/b/c"))
}
// 结果
// /a/b
func Ext(path string) string

返回路径使用的文件扩展名。

扩展名为路径最后一个由斜杠分割的元素的最后一个点之后; 如果路径的这个部分没有点, 那么它的扩展名为空。

示例:

package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(path.Ext("/a/b/c/bar.css"))
}
// 结果
//.css
IsAbs 函数
package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(path.IsAbs("/dev/null"))
}
// 结果
// true
func Join(elem …string) string
package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(path.Join("a", "b", "c"))
    fmt.Println(path.Join("a", "b/c"))
    fmt.Println(path.Join("a/b", "c"))
    fmt.Println(path.Join("a/b", "/c"))
}
// 结果
// a/b/c
// a/b/c
// a/b/c
// a/b/c
func Match(pattern, name string) (matched bool, err error)
模式:
    { 匹配项 }

匹配项:
    '*'         匹配任意长度的非 / 字符
    '?'         匹配单个非 / 字符
    '[' [ '^' ] { 字符范围 } ']'
                字符类型必须是非空的
    c           匹配不等于 '*' 、 '?' 、 '\\' 和 '[' 的字符 c
    '\\' c      匹配字符 c

字符范围
    c           匹配不等于 '\\' 、 '-' 、 和 ']' 的字符 c
    '\\' c      匹配字符 c
    lo '-' hi   匹配字符 c ,其中 lo <= c <= hi
// 结果
func Split(path string) (dir, file string)

根据路径的最后一个斜杠, 将路径划分为目录部分和文件名部分。

如果路径中不包含斜杠, 那么返回一个空的目录, 并将文件名部分设置为路径本身。

返回值满足这样一个属性, 也即是, path = dir + file 。

package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(path.Split("static/myfile.css"))
}
// 结果
// static/ myfile.css