结合 URL 路径与 path.Join()

新手上路,请多包涵
阅读 2.5k
2 个回答

函数 path.Join 需要一个路径,而不是一个 URL。 解析 URL 以获取路径并加入该路径:

 u, err := url.Parse("http://foo")
if err != nil { log.Fatal(err) }
u.Path = path.Join(u.Path, "bar.html")
s := u.String()
fmt.Println(s)  // prints http://foo/bar.html

在 Go 1.19 或更高版本中使用 url.JoinPath 函数:

 s, err := url.JoinPath("http://foo", "bar.html")
if err != nil { log.Fatal(err) }
fmt.Println(s) // prints http://foo/bar.html

如果 要从基本 URL 解析 URI 引用, 请使用 ResolveReference 。此操作不同于简单的路径连接:引用中的绝对路径替换整个基本路径;基本路径被修剪回连接操作之前的最后一个斜杠。

 base, err := url.Parse("http://foo/quux.html")
if err != nil {
    log.Fatal(err)
}
ref, err := url.Parse("bar.html")
if err != nil {
    log.Fatal(err)
}
u := base.ResolveReference(ref)
fmt.Println(u.String()) // prints http://foo/bar.html

请注意基本 URL 中的 quux.html 如何不出现在已解析的 URL 中。

原文由 Cerise Limón 发布,翻译遵循 CC BY-SA 4.0 许可协议

net/url 包中的 ResolveReference()

接受的答案不适用于包含 .html 或 .img 等文件结尾的相对 url 路径。 ResolveReference() 函数是在 go 中加入 url 路径的正确方法。

 package main

import (
    "fmt"
    "log"
    "net/url"
)

func main() {
    u, err := url.Parse("../../..//search?q=dotnet")
    if err != nil {
        log.Fatal(err)
    }
    base, err := url.Parse("http://example.com/directory/")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(base.ResolveReference(u))
}

原文由 mmmkay 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题