为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕沐林林 2023-04-04 14:33:32
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 的对应物
查看完整描述

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 "../.."


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信