给定两个绝对 URI,找到它们之间的相对路径

go 标准库中是否有一个函数可以让我这样做


a = 'www.my.com/your/stuff'

b = 'www.my.com/your/stuff/123/4'


function(b,a) // /123/4 

或者


function(URL(b),URL(a)) // /123/4

在这种情况下可能定义了以下内容


function(a,b) // error ? or ../../

我知道我可以path为此使用包。但在很多情况下,如果有查询参数、文件扩展名等,它就无法工作。


基本上我正在寻找path.resolveURL 的对应物


慕沐林林
浏览 84回答 1
1回答

芜湖不芜

事实证明,这个path/filepath包可以为你做这件事。如果您忽略这些是 URL 的事实,而是将它们视为路径,您可以使用filepath.Rel():package mainimport (    "fmt"    "path/filepath")func main() {    base := "www.my.com/your/stuff"    target := "www.my.com/your/stuff/123/4"    rel, _ := filepath.Rel(base, target)    fmt.Println(rel) // prints "123/4"}如果您想将这些路径视为实际 URL,您可能应该使用该net/url包首先将路径解析为 URL,然后提取路径并filepath.Rel()在其上使用。这使您可以正确处理 URL 字符串中的查询之类的问题,这些问题会出错filepath,如下所示:package mainimport (    "fmt"    "path/filepath"    "net/url")func main() {    url1, _ := url.Parse("http://www.my.com/your/stuff")    url2, _ := url.Parse("http://www.my.com/your/stuff/123/4?query=test")    base := url1.Path    target := url2.Path    rel, _ := filepath.Rel(base, target)    fmt.Println(base)   // "/your/stuff"    fmt.Println(target) // "/your/stuff/123/4"    fmt.Println(rel)    // "123/4"}作为奖励,filepath.Rel()它也足够聪明来处理另一个方向的相对路径:rel, _ = filepath.Rel(target, base) // rel is now "../.."
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go