Go 中 path 和 path.filepath 包有什么区别

问题描述 投票:0回答:3

我发现包path和包path/filepath中有很多类似的功能。我尝试了几种常见的路径,例如

/var/log/something
,但没有发现任何差异。什么时候应该直接使用
path
,什么时候应该使用
filepath

go path filepath
3个回答
51
投票

有什么区别?

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

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

我什么时候使用它们?

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


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 == ".")
   }
}

1
投票

https://pkg.go.dev/path

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

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

https://pkg.go.dev/filepath

Package filepath 实现实用程序,以与目标操作系统定义的文件路径兼容的方式操作文件名路径。

文件路径包使用正斜杠或反斜杠,具体取决于操作系统。要处理无论操作系统如何始终使用正斜杠的 URL 等路径,请参阅路径包。

© www.soinside.com 2019 - 2024. All rights reserved.