我发现在path包和path/filepath包中有很多相似的函数。我尝试了一些常见路径,如/var/log/something
,但没有找到任何区别。什么情况下应该直接使用path
或者使用filepath
呢?
我发现在path包和path/filepath包中有很多相似的函数。我尝试了一些常见路径,如/var/log/something
,但没有找到任何区别。什么情况下应该直接使用path
或者使用filepath
呢?
虽然功能类似,但path和path/filepath提供了不同的实现。Filepath依赖于os包来选择目标运行时的文件分隔符以及在处理路径字符串时使用其他不同的组件。
您可以查看操作系统源代码,以了解各种实用程序函数的不同实现。这使得库可以将特定于操作系统的细节抽象化,并帮助实现可移植性。 path/filepath 依赖关系图说明了该软件包如何依赖于os软件包。您可以将其与path 依赖关系图进行比较。我鼓励您进入filepath和path源代码中观察此关系。
在处理文件时,应使用 filepath。这样可以确保您的路径与实际文件匹配,而不受底层运行时的影响。在模型内部或需要将路径序列化或与其他程序通信时,应使用 path 库。这样可以确保在任何平台上运行编程时都使用单一的格式方案。具有一致的格式使得对模型的推理更加通用和易于理解。
路径包实现了用于操作斜杠分隔的路径的实用程序例程。
路径包应仅用于由正斜杠(/)分隔的路径,例如URL中的路径。该包不处理带有驱动器号或反斜杠的Windows路径;要处理操作系统路径,请使用path/filepath包。
文件路径包实现了与目标操作系统定义的文件路径兼容的文件名路径的实用程序例程。
filepath包根据操作系统使用正斜杠或反斜杠。要处理始终使用正斜杠而不考虑操作系统的路径(如URL),请参见path包。
我发现在Windows中,path/filepath
很有用,因为它可以处理斜杠或反斜杠,而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 == ".")
}
}