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 函数从两个绝对路径获取相对路径。让我们看看代码。
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 函数将路径拆分为组件并构建相对路径。
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 包函数。