Golang程序 从两个绝对路径获得相对路径

Golang程序 从两个绝对路径获得相对路径

在Golang中,为了从两个绝对路径中获得相对路径,我们使用filepath和string包。相对路径告诉我们文件相对于当前工作目录的位置,而绝对路径告诉我们文件从根目录开始的位置。在第一种方法中,我们将使用filepath包函数,在第二种方法中,我们将使用strings包函数。

方法1:使用文件路径包

在这个程序中,使用path/filepath包中的filepath.Base函数提取文件的基本名称,也就是没有目录路径的文件名称。然后使用fmt包将提取的文件名显示在控制台。

语法

filepath.Rel
Go

这个函数用于查找两个文件路径之间的相对路径。它需要两个输入–basepath和targetpath。

算法

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

  • 第2步 – 创建一个函数main,并在该函数中创建两个路径变量path1和path,并给它们分配绝对路径。

  • 第3步 – 现在使用filepath.Rel函数从两个绝对路径中获得相对路径。

  • 第4步 – 如果成功获得路径,它将被打印在控制台,但如果没有成功获得,则在控制台打印错误并返回。

  • 第5步 – 使用fmt.Println()函数执行打印语句。

例子

在这个例子中,我们将使用filepath.Rel函数,从两个绝对路径中获得相对路径。让我们看一下代码。

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
}
Go

输出

Relative path: ../folder2
Go

方法2:使用字符串包

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

语法

func Split(str, sep string) []string
Go

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

func len(v Type) int
Go

len()函数是用来获取任何参数的长度的。它需要一个参数作为数据类型的变量,我们希望找到它的长度,并返回整数值,即该变量的长度。

算法

  • 第1步 – 创建一个包main,并在程序中声明fmt(格式包)、字符串包,其中main产生可执行代码,fmt帮助格式化输入和输出。

  • 第2步 – 用main函数中定义的两个绝对路径和一个字符串类型的错误创建一个函数relativePath。

  • 第3步– 在这一步中,使用strings.Split函数将路径分成若干部分。

  • 第4步 – 然后,遍历组件1和组件2,检查它们是否有共同的前缀或它们是否相等。

  • 第5步 – 如果路径没有共同的前缀,在控制台打印出来。

  • 第6步 – 然后,通过在绝对路径的其余部分添加./来建立一个相对路径。

  • 第7步 – 在所有前面的步骤完成后,将相对路径返回给函数。

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

  • 第9步 – 使用fmt.Println()函数执行打印语句。

例子

在这个例子中,我们将使用strings.Split函数将路径分成若干部分并建立相对路径。

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
}
Go

输出

Relative path: folder2/
Go

总结

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册