Golang 通过两个绝对路径获取相对路径
在Golang中,我们使用filepath和string包来获取两个绝对路径之间的相对路径。 相对路径告诉文件在当前工作目录中的位置,而绝对路径则从根目录开始告诉文件的位置。 第一种方法中,我们将使用filepath包函数,第二种方法中将使用strings包函数。
方法1:使用Filepath包
在这个程序中,使用filepath.Base函数从path/filepath包中提取文件的基本名称,即不带目录路径的文件名。然后,使用fmt包将提取的文件名称显示在控制台上。
语法
filepath.Rel
此函数用于找到两个文件路径之间的相对路径。它接受两个输入 – 基路径(basepath)和目标路径(targetpath)。
步骤
- 步骤1 - 在main程序中创建一个包main,并声明fmt(格式化包),path/filepath包,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
}
输出
Relative path: ../folder2
方法2:使用Strings包
在这种方法中,首先使用strings.Split函数将绝对路径分成各个部分。然后,对组件进行迭代并进行比较,以找到两个路径之间的共同前缀。如果路径之间没有共同前缀,则返回错误。否则,首先添加Path1中的剩余组件,然后添加Path2中的剩余组件,以创建相对路径。
语法
func Split(str, sep string) []string
Split()函数用于通过提供的分隔符拆分字符串。此函数在字符串包中存在,并且它接受要拆分的字符串作为参数以及一个分隔符。然后该函数将返回最终的字符串数组作为结果。
func len(v Type) int
len()函数用于获取任何参数的长度。它接受一个参数作为数据类型变量,其长度我们希望找到并返回整数值,该整数值是变量的长度。
步骤
- 步骤1 − 在程序中创建一个包main,并声明fmt(格式包),strings包,其中main生成可执行代码,fmt用于格式化输入和输出。
-
步骤2 − 在main函数中创建一个具有两个在main函数中定义的绝对路径和一个字符串类型的错误的函数relativePath。
-
步骤3 − 在这一步中,使用strings.Split函数将路径拆分成组件。
-
步骤4 − 然后,迭代components1和components2以检查它们是否具有任何公共前缀或它们是否相等。
-
步骤5 − 如果路径没有公共前缀,则在控制台上打印出来。
-
步骤6 − 然后,在绝对路径的剩余组件中添加../来构建相对路径。
-
步骤7 − 在执行了所有先前的步骤后,将相对路径返回给函数。
-
步骤8 − 在主函数中,如果成功获取了相对路径,将在控制台上打印出来,但是如果在获取路径时发生错误,则打印出错误并返回。
-
步骤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
}
输出
Relative path: folder2/
结论
我们执行了使用两个示例从两个绝对路径获取相对路径的程序。在第一个示例中,我们使用了filepath.Rel函数找到相对路径,在第二个示例中,我们使用了strings包的函数。