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】:

有什么区别?

虽然功能相似,但 pathpath/filepath 提供不同的实现。在处理路径字符串时,文件路径依赖于os 包来选择目标运行时的文件分隔符和其他不同的组件。

您可以查看os source,以了解各种实用功能的不同实现。这允许库抽象出操作系统特定的细节,并有助于实现可移植性。 path/filepath dependency graph 说明了包如何依赖于 os 包。您可以将其与 路径 dependency graph 进行比较。我鼓励您进入filepath 和path 源代码来观察这种关系。

我什么时候使用它们?

在处理文件时,您应该使用 filepath。这确保您的路径将与实际文件匹配,而不管底层运行时如何。 path 库应在模型中使用,或者在路径可能被序列化或与其他程序通信时使用。这确保了无论程序运行在什么平台上,都使用单一的格式化方案。采用一致的格式可以使模型推理更通用且更易于理解。

【讨论】:

这是一个比文件路径建议的更棘手的话题。 Posix / 分隔符是该方案中的一个特殊字符,但通常在不同的操作系统上可能不是这样。这不是一个完全通用的解决方案,因为段中允许的字符集在操作系统之间是不同的,从而导致棘手的边缘情况。此外,Windows 也接受 /(即它具有 posix 合规性)。

以上是关于Go 中的 path 和 path.filepath 包有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Go语言中Path包用法

执行“go get path/to/myapp”时,我可以获得正确的版本和构建信息吗?

exec: "go": executable file not found in $PATH异常的原因

go编程语言 设置环境变量是怎么回事

go 基础安装

Go path/filepath文件路径操作