Go 学习笔记(53)— Go 标准库之 path(判断绝对路径、拆分目录和文件、组合路径、返回路径目录、获取路径最后文件名、获取文件扩展名、路径匹配规则)

1. 概述说明

import "path"

path 实现了对斜杠分隔的路径的实用操作函数。

2. 主要函数

2.1 func IsAbs

func IsAbs(path string) bool

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

2.2 func Split

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

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

2.3 func Join

func Join(elem ...string) string

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

2.4 func Dir

func Dir(path string) string

Dir 返回路径除去最后一个路径元素的部分,即该路径最后一个元素所在的目录。在使用 Split 去掉最后一个元素后, 会简化路径并去掉末尾的斜杠。

  • 如果路径是空字符串,会返回 .
  • 如果路径由 1 到多个斜杠后跟 0 到多个非斜杠字符组成,会返回 /
  • 其他任何情况下都不会返回以斜杠结尾的路径;

2.5 func Base

func Base(path string) string

Base 函数返回路径的最后一个元素。在提取元素前会求掉末尾的斜杠。

  • 如果路径是"",会返回".";
  • 如果路径是只有 一个斜杆构成,会返回 /

2.6 func Ext

func Ext(path string) string

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

2.7 func Clean

func Clean(path string) string

Clean 函数通过单纯的词法操作返回和 path 代表同一地址的最短路径。
它会不断的依次应用如下的规则,直到不能再进行任何处理:

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

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

2.8 func Match

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

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

pattern:
{ term }
term:
‘*’ 匹配0或多个非/的字符
‘?’ 匹配1个非/的字符
‘[’ [ ‘^’ ] { character-range } ‘]’ 字符组(必须非空)

c 匹配字符c(c != ‘*’, ‘?’, ‘\’, ‘[’)

‘\’ c 匹配字符c

character-range:

c 匹配字符c(c != ‘\’, ‘-’, ‘]’)

‘\’ c 匹配字符c

lo ‘-’ hi 匹配区间[lo, hi]内的字符

Match 要求匹配整个 name 字符串,而不是它的一部分。只有 pattern 语法错误时,会返回 ErrBadPattern

3. 代码示例

以下代码在 Windows 平台执行,可以看出有很多输出和实际预期的并不一致。

func main() {
	absFlag := path.IsAbs("./")
	fmt.Println("absFlag is ", absFlag) // absFlag is  false

	dir, file := path.Split("E:\\golang\\src\\temp.go")
	fmt.Println("dir is ", dir, "file is ", file) // dir is   file is  E:\golang\src\temp.go

	fullPath := path.Join("E:", "golang", "src", "temp.go")
	fmt.Println("fullPath is ", fullPath) // fullPath is  E:/golang/src/temp.go

	dirPath := path.Dir("E:\\golang\\src\\temp.go")
	fmt.Println("dirPath is ", dirPath) // dirPath is  .

	baseName := path.Base("E:\\golang\\src\\temp.go")
	fmt.Println("baseName is ", baseName) // baseName is  E:\golang\src\temp.go

	extName := path.Ext("E:\\golang\\src\\temp.go")
	fmt.Println("extName is ", extName) // extName is  .go

	fmt.Println(path.Clean("./a/b/../"))  // a
	fmt.Println(path.Match("*", "a"))     // true <nil>
	fmt.Println(path.Match("*", "a/b/c")) // false <nil>
	fmt.Println(path.Match("\\b", "b"))   // true <nil>
}

import "path" 替换为 "path/filepath" ,并将代码中的 path 替换为 filepath ,就可以得到预期的结果。因为 filepath 包实现了兼容各操作系统的文件路径的实用操作函数。

参考:
https://www.cnblogs.com/jkko123/p/6923962.html
https://studygolang.com/static/pkgdoc/pkg/path.htm

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值