1 回答
TA贡献1796条经验 获得超7个赞
事实证明,这个path/filepath
包可以为你做这件事。如果您忽略这些是 URL 的事实,而是将它们视为路径,您可以使用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"
}
如果您想将这些路径视为实际 URL,您可能应该使用该net/url
包首先将路径解析为 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"
}
作为奖励,filepath.Rel()
它也足够聪明来处理另一个方向的相对路径:
rel, _ = filepath.Rel(target, base) // rel is now "../.."
- 1 回答
- 0 关注
- 83 浏览
添加回答
举报