Go 中的 path 和 path.filepath 包有啥区别
Posted
技术标签:
【中文标题】Go 中的 path 和 path.filepath 包有啥区别【英文标题】:What's the difference between path & path.filepath packages in GoGo 中的 path 和 path.filepath 包有什么区别 【发布时间】:2017-01-04 00:58:57 【问题描述】:我发现包path和包path/filepath中有很多类似的功能。我尝试了几种常见的路径,例如/var/log/something
,但没有发现任何差异。什么时候应该直接使用path
,什么时候应该使用filepath
?
【问题讨论】:
【参考方案1】:我发现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 == ".")
【讨论】:
【参考方案2】:有什么区别?
虽然功能相似,但 path 和 path/filepath 提供不同的实现。在处理路径字符串时,文件路径依赖于os 包来选择目标运行时的文件分隔符和其他不同的组件。
您可以查看os source,以了解各种实用功能的不同实现。这允许库抽象出操作系统特定的细节,并有助于实现可移植性。 path/filepath dependency graph 说明了包如何依赖于 os 包。您可以将其与 路径 dependency graph 进行比较。我鼓励您进入filepath 和path 源代码来观察这种关系。
我什么时候使用它们?
在处理文件时,您应该使用 filepath。这确保您的路径将与实际文件匹配,而不管底层运行时如何。 path 库应在模型中使用,或者在路径可能被序列化或与其他程序通信时使用。这确保了无论程序运行在什么平台上,都使用单一的格式化方案。采用一致的格式可以使模型推理更通用且更易于理解。
【讨论】:
这是一个比文件路径建议的更棘手的话题。 Posix / 分隔符是该方案中的一个特殊字符,但通常在不同的操作系统上可能不是这样。这不是一个完全通用的解决方案,因为段中允许的字符集在操作系统之间是不同的,从而导致棘手的边缘情况。此外,Windows 也接受 /(即它具有 posix 合规性)。以上是关于Go 中的 path 和 path.filepath 包有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
执行“go get path/to/myapp”时,我可以获得正确的版本和构建信息吗?