path, filepath 路径管理
在 Golang 中, 对于路径管理有两个标准包, path
和 filepath
。
到底使用上有什么区别呢? 其实也不难, 从名字上就可以看出来。
-
path
可以理解成 基础包, 对于分隔符, 只能处理 斜线/
类型。官方建议是处理 URL 地址, 使用此包。 更多信息, 可以参考包描述信息: https://pkg.go.dev/path#pkg-overview -
filepath
看名字就知道是 文件路径 扩展包。 可以针对处理不同操作类型的的分隔符。 必须 Windows 的\
, 其他系统的/
。 另外提供的方法也比path
多。 同名方法 在实现上, 与path
还是有差异的。 更多信息, 可以参考包描述信息: https://pkg.go.dev/path/filepath#pkg-overview
filepath
和 path
包都提供了 Join()
函数进行字符串的连接。 但是这个方法 不能直接 用来连接 URL, 就是因为 URL 在带有协议的时候, 具有 http://www.example.com/api
使用了两个 //
。
如果直接 Join()
方法, 将会丢失一个斜线。
func TestPathJoinURL(t *testing.T) {
domain := "http://www.baidu.com/chatgpt"
res := "/api/v1/demo"
s := path.Join(domain, res)
fmt.Println(s)
// Output:
// 注意, 这里协议后面少了一个斜线。
// http:/www.baidu.com/chatgpt/api/v1/demo
}
而应该使用 url.PathJoin
func Test_URLJoinURL(t *testing.T) {
domain := "http://www.baidu.com/chatgpt"
res := "/api/v1/demo"
s, err := url.JoinPath(domain, res)
if err != nil {
panic(err)
}
fmt.Println(s)
// Output:
// http://www.baidu.com/chatgpt/api/v1/demo
}