一. 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 ""
}