filepath包是维护文件名和路径的工具。

扩展名
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	fmt.Printf("No dots: %q\n", filepath.Ext("index"))         //
	fmt.Printf("One dot: %q\n", filepath.Ext("index.js"))      // .js
	fmt.Printf("Two dots: %q\n", filepath.Ext("main.test.js")) // .js
}

获取目录最底层目录或文件
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	fmt.Println(filepath.Base("/foo/bar/baz.js")) // baz.js
	fmt.Println(filepath.Base("/foo/bar/baz"))    // baz
	fmt.Println(filepath.Base("/foo/bar/baz/"))   // baz
	fmt.Println(filepath.Base("dev.txt"))         // dev.txt
	fmt.Println(filepath.Base("../todo.txt"))     // todo.txt
	fmt.Println(filepath.Base(".."))              // ..
	fmt.Println(filepath.Base("."))               // .
	fmt.Println(filepath.Base("/"))               // \
	fmt.Println(filepath.Base(""))                // .

}

获取父路径
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	fmt.Println(filepath.Dir("/foo/bar/baz.js")) // \foo\bar
	fmt.Println(filepath.Dir("/foo/bar/baz"))    // \foo\bar
	fmt.Println(filepath.Dir("/foo/bar/baz/"))   // \foo\bar\baz
	fmt.Println(filepath.Dir("/dirty//path///")) // \dirty\path
	fmt.Println(filepath.Dir("dev.txt"))         // .
	fmt.Println(filepath.Dir("../todo.txt"))     // ..
	fmt.Println(filepath.Dir(".."))              // .
	fmt.Println(filepath.Dir("."))               // .
	fmt.Println(filepath.Dir("/"))               // \
	fmt.Println(filepath.Dir(""))                // .

}

判断是否是绝对路径
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	fmt.Println(filepath.IsAbs("D:\\a.txt")) // true
	fmt.Println(filepath.IsAbs(".bashrc"))   // false
	fmt.Println(filepath.IsAbs(".."))        // false
	fmt.Println(filepath.IsAbs("."))         // false
	fmt.Println(filepath.IsAbs("/"))         // false
	fmt.Println(filepath.IsAbs(""))          // false

}

合并路径
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	fmt.Println(filepath.Join("a", "b", "c"))         // a\b\c
	fmt.Println(filepath.Join("a", "b/c"))            // a\b\c
	fmt.Println(filepath.Join("a/b", "c"))            // a\b\c
	fmt.Println(filepath.Join("a/b", "/c"))           // a\b\c
	fmt.Println(filepath.Join("a/b", "../../../xyz")) // ..\xyz

}

获取相对路径
package main

import (
	"fmt"
	"path/filepath"
)

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

	rel, _ := filepath.Rel(base, paths[0])
	fmt.Println(rel) // b\c

	rel, _ = filepath.Rel(base, paths[1])
	fmt.Println(rel) // ..\b\c

	rel, _ = filepath.Rel(base, paths[2])
	fmt.Println(rel) // 失败

}

多个目录分割
package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	paths := filepath.SplitList("/a/b/c;/usr/bin")
	fmt.Println(paths[0]) // /a/b/c
	fmt.Println(paths[1]) // /usr/bin
}

参考