Go语言中Path和Path.filepath包有什么区别?

40

我发现在path包和path/filepath包中有很多相似的函数。我尝试了一些常见路径,如/var/log/something,但没有找到任何区别。什么情况下应该直接使用path或者使用filepath呢?

3个回答

54

有什么区别?

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

您可以查看操作系统源代码,以了解各种实用程序函数的不同实现。这使得库可以将特定于操作系统的细节抽象化,并帮助实现可移植性。 path/filepath 依赖关系图说明了该软件包如何依赖于os软件包。您可以将其与path 依赖关系图进行比较。我鼓励您进入filepathpath源代码中观察此关系。

我应该在什么时候使用它们?

在处理文件时,应使用 filepath。这样可以确保您的路径与实际文件匹配,而不受底层运行时的影响。在模型内部或需要将路径序列化或与其他程序通信时,应使用 path 库。这样可以确保在任何平台上运行编程时都使用单一的格式方案。具有一致的格式使得对模型的推理更加通用和易于理解。


这个话题比文件路径所暗示的要棘手得多。在该方案中,Posix / 分隔符是一个特殊字符,但在其他操作系统上可能不是这样。它并不是完全通用的解决方案,因为不同操作系统中允许在段中使用的字符集是不同的,从而导致一些棘手的边缘情况。此外,Windows 也接受 /(即它具有 posix 兼容性)。 - Rick-777

2

https://pkg.go.dev/path

路径包实现了用于操作斜杠分隔的路径的实用程序例程。

路径包应仅用于由正斜杠(/)分隔的路径,例如URL中的路径。该包不处理带有驱动器号或反斜杠的Windows路径;要处理操作系统路径,请使用path/filepath包。

https://pkg.go.dev/filepath

文件路径包实现了与目标操作系统定义的文件路径兼容的文件名路径的实用程序例程。

filepath包根据操作系统使用正斜杠或反斜杠。要处理始终使用正斜杠而不考虑操作系统的路径(如URL),请参见path包。


1

我发现在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 == ".")
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接