《Shell 转 Go》
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

path, filepath 路径管理

在 Golang 中, 对于路径管理有两个标准包, pathfilepath

到底使用上有什么区别呢? 其实也不难, 从名字上就可以看出来。

  1. path 可以理解成 基础包, 对于分隔符, 只能处理 斜线 / 类型。官方建议是处理 URL 地址, 使用此包。 更多信息, 可以参考包描述信息: https://pkg.go.dev/path#pkg-overview

  2. filepath 看名字就知道是 文件路径 扩展包。 可以针对处理不同操作类型的的分隔符。 必须 Windows 的 \ , 其他系统的 /。 另外提供的方法也比 path 多。 同名方法 在实现上, 与 path 还是有差异的。 更多信息, 可以参考包描述信息: https://pkg.go.dev/path/filepath#pkg-overview

说说 URL 字符串的连接处理(小坑)

filepathpath 包都提供了 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
}