Go语言程序获取两个绝对路径的相对路径


要获取 Go 语言中两个绝对路径的相对路径,我们使用 filepath 和 string 包。相对路径相对于当前工作目录指示文件的位置,而绝对路径则从根目录开始指示文件的位置。在第一种方法中,我们将使用 filepath 包函数,在第二种方法中,我们将使用 strings 包函数。

方法 1:使用 Filepath 包

在此程序中,使用 path/filepath 包中的 filepath.Base 函数提取文件的基名,即不带目录路径的文件名。然后,使用 fmt 包在控制台上显示提取的文件名。

语法

filepath.Rel

此函数用于查找两个文件路径之间的相对路径。它接受两个输入 - 基路径和目标路径。

算法

  • 步骤 1 − 创建一个包 main 并声明 fmt(格式化包)、path/filepath 包在程序中,其中 main 生成可执行代码,fmt 帮助格式化输入和输出。

  • 步骤 2 − 创建一个函数 main,并在该函数中创建两个路径变量 path1 和 path 并为其分配绝对路径。

  • 步骤 3 − 现在使用 filepath.Rel 函数从两个绝对路径获取相对路径。

  • 步骤 4 − 如果成功获取路径,则将其打印到控制台,但如果未成功获取,则在控制台上打印错误并返回。

  • 步骤 5 − 使用 fmt.Println() 函数执行打印语句

示例

在此示例中,我们将使用 filepath.Rel 函数从两个绝对路径获取相对路径。让我们看看代码。

Open Compiler
package main import ( "fmt" "path/filepath" ) func main() { Path1 := "/home/asus/user/src/github.com/folder1" //absolute path1 Path2 := "/home/asus/user/src/github.com/folder2" //absolute path2 relPath, err := filepath.Rel(Path1, Path2) //use the Rel function to get the relative path if err != nil { fmt.Println("Error:", err) //print error if no path is obtained return } fmt.Println("Relative path:", relPath) //print the relative path }

输出

Relative path: ../folder2

方法 2:使用 Strings 包

在此方法中,首先使用 strings.Split 函数将绝对路径划分为其组成部分。在下一步中,迭代组件并进行比较以查找两个路径之间的公共前缀。如果路径之间没有公共前缀,则返回错误。否则,将 Path1 中的剩余组件首先添加,然后添加 Path2 中的剩余组件,以创建相对路径。

语法

func Split(str, sep string) []string

Split() 函数用于通过提供的分隔符分割字符串。此函数存在于 strings 包中,它接受要分割的字符串作为参数以及一个分隔符。然后,该函数返回最终的字符串数组作为结果。

func len(v Type) int

len() 函数用于获取任何参数的长度。它将一个参数作为我们希望查找其长度的数据类型变量,并返回一个整数,该整数是变量的长度。

算法

  • 步骤 1 − 创建一个包 main 并声明 fmt(格式化包)、strings 包在程序中,其中 main 生成可执行代码,fmt 帮助格式化输入和输出。

  • 步骤 2 − 创建一个函数 relativePath,其中定义了 main 函数中的两个绝对路径和一个字符串类型的错误。

  • 步骤 3 − 在此步骤中,使用 strings.Split 函数将路径拆分为组件。

  • 步骤 4 − 然后,迭代 components1 和 components2 以检查它们是否具有任何公共前缀或它们是否相等。

  • 步骤 5 − 如果路径没有公共前缀,则在控制台上打印它。

  • 步骤 6 − 然后,通过在绝对路径的剩余组件中添加 ../ 来构建相对路径。

  • 步骤 7 − 执行完所有先前的步骤后,将相对路径返回到函数。

  • 步骤 8 − 在 main 中,如果成功获取相对路径,它将打印到控制台,但如果在获取路径时发生错误,则打印错误并返回。

  • 步骤 9 − 使用 fmt.Println() 函数执行打印语句

示例

在此示例中,我们将使用 strings.Split 函数将路径拆分为组件并构建相对路径。

Open Compiler
package main import ( "fmt" "strings" ) func relativePath(Path1, Path2 string) (string, error) { components1 := strings.Split(Path1, "/") //break the path into components components2 := strings.Split(Path2, "/") var i int for i = 0; i < len(components1) && i < len(components2); i++ { if components1[i] != components2[i] { //check if they are equal break } } if i == 0 { return "", fmt.Errorf("Paths do not have a common prefix") //print error if thry don’t have a common prefix } var relativePath string for j := i; j < len(components1)-1; j++ { relativePath += "../" //append the directory into remaining components } for j := i; j < len(components2); j++ { relativePath += components2[j] + "/" } return relativePath, nil //return the relativepath } func main() { Path1 := "/home/user/go/src/github.com/project/folder1" //absolute path1 Path2 := "/home/user/go/src/github.com/project/folder2" //absolute path2 relPath, err := relativePath(Path1, Path2) if err != nil { fmt.Println("Error:", err) //if no path is obtained print error return } fmt.Println("Relative path:", relPath) //print the relativepath }

输出

Relative path: folder2/

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

结论

我们使用两个示例执行了从两个绝对路径获取相对路径的程序。在第一个示例中,我们使用 filepath.Rel 查找相对路径,在第二个示例中,我们使用 strings 包函数。

更新于: 2023-02-22

4K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告