我发现包path和包path/filepath中有很多类似的功能。我尝试了几种常见的路径,例如
/var/log/something
,但没有发现任何差异。什么时候应该直接使用path
,什么时候应该使用filepath
?
虽然功能相似,但 path 和 path/filepath 提供不同的实现。在处理路径字符串时,文件路径依赖于 os 包来选择目标运行时的文件分隔符和其他不同的组件。
您可以查看 os 源代码,以了解各种实用程序函数有不同的实现。这允许库将特定于操作系统的细节抽象出来,并有助于实现可移植性。 path/filepath dependency graph 说明了包如何依赖于 os 包。您可以将其与 path dependency graph 进行比较。我鼓励您进入 filepath 和 path 源代码来观察这种关系。
处理文件时应使用filepath。这确保您的路径将与实际文件匹配,而不管底层运行时如何。 path 库应该在模型中使用,或者当路径可能被序列化或与其他程序通信时。这确保无论程序在什么平台上运行,都使用单一的格式化方案。具有一致的格式使得关于模型的推理更加通用且更易于理解。
我发现
path/filepath
对 Windows 很有用,因为它可以处理斜杠或反斜杠,
而 path
只处理斜杠:
package main
import (
"path"
"path/filepath"
)
func main() {
{ // example 1
s := filepath.Dir(`C:\go\bin`)
println(s == `C:\go`)
}
{ // example 2
s := filepath.Dir("C:/go/bin")
println(s == `C:\go`)
}
{ // example 3
s := path.Dir("C:/go/bin")
println(s == "C:/go")
}
{ // example 4
s := path.Dir(`C:\go\bin`)
println(s == ".")
}
}
包路径实现用于操作斜杠分隔路径的实用程序。
path 包应该只用于由正斜杠分隔的路径,例如 URL 中的路径。此包不处理带有驱动器号或反斜杠的 Windows 路径;要操作操作系统路径,请使用路径/文件路径包。
Package filepath 实现实用程序,以与目标操作系统定义的文件路径兼容的方式操作文件名路径。
文件路径包使用正斜杠或反斜杠,具体取决于操作系统。要处理无论操作系统如何始终使用正斜杠的 URL 等路径,请参阅路径包。