Go : 使用避坑指南 path 包

一. path

1. path.base

var o = string("D:/126/1236/bs/213g/123")
fmt.Println(path.Base(o)) // 输出 123

var p = string("D:\\126\\1236\\bs\\213g\\123")
fmt.Println(path.Base(p)) // 输出 D:\126\1236\bs\213g\123

/* 使用path.Base 避坑方案 */
func toLinuxPath(str string) string {
    return strings.ReplaceAll(str, "\\", "/")
}
fmt.Println(path.Base(toLinuxPath(p))) // 输出 123

/* 或者自己封装一下 */
func PathBase(str string) string {
    if "" == str { return "" } // 根据需要加这一句, 不加传入为空是返回的是 "."
    return path.Base(toLinuxPath(str))
}
fmt.Println(PathBase(p)) // 输出 123

2. path.join

    拼接的使用使用的拼接符是"/", 若是需要可先转化成toLinux再使用path.join

fmt.Println(path.Join("/root/test/t1", "\\asd\\asd1"))
fmt.Println(path.Join("D:\\1\\2\\3\\4\\5", "6/7/8"))
fmt.Println(path.Join("8", "9"))

/*
/root/test/t1/\asd\asd1
D:\1\2\3\4\5/6/7/8
8/9
*/

    查看源码知道, path.join 内部调用了path.clean, 而path.clean 的操作针对的是"/" 而不是"\", 所以将"\"直接转化成"/"可以使join时的格式统一和保证合并之后的路径合法 

   改成:既可以保证路径中取出./ ../等路径, 然后将"\" 替换成"/"了

func toLinux(p string) string {
    return strings.ReplaceAll(p, "\\", "/")
} 

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听我一言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值