给定两个绝对 URI,找到它们之间的相对路径
Given two absolute URI, find the relative path between them
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
包。但是在很多有查询参数,文件扩展名等的情况下它不能工作
基本上我正在寻找 URL
的 path.resolve
对应物
原来 path/filepath
package can do this for you. If you ignore the fact that these are URLs and instead treat them like paths, you can use filepath.Rel()
:
package main
import (
"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"
}
游乐场:https://play.golang.org/p/nnF9zfFAFfc
如果您想将这些路径视为实际的 URLs,您可能应该使用 net/url
package 首先将路径解析为 URL,然后提取路径并使用filepath.Rel()
在那上面。这允许您正确处理 URL 字符串中的查询之类的事情,这会导致 filepath
,如下所示:
package main
import (
"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"
}
游乐场:https://play.golang.org/p/gnZfk0t8GOZ
作为奖励,filepath.Rel()
也足够聪明,可以处理另一个方向的相对路径:
rel, _ = filepath.Rel(target, base) // rel is now "../.."
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
包。但是在很多有查询参数,文件扩展名等的情况下它不能工作
基本上我正在寻找 URL
的path.resolve
对应物
原来 path/filepath
package can do this for you. If you ignore the fact that these are URLs and instead treat them like paths, you can use filepath.Rel()
:
package main
import (
"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"
}
游乐场:https://play.golang.org/p/nnF9zfFAFfc
如果您想将这些路径视为实际的 URLs,您可能应该使用 net/url
package 首先将路径解析为 URL,然后提取路径并使用filepath.Rel()
在那上面。这允许您正确处理 URL 字符串中的查询之类的事情,这会导致 filepath
,如下所示:
package main
import (
"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"
}
游乐场:https://play.golang.org/p/gnZfk0t8GOZ
作为奖励,filepath.Rel()
也足够聪明,可以处理另一个方向的相对路径:
rel, _ = filepath.Rel(target, base) // rel is now "../.."