Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将URL路径与path.Join()组合_Url_Go_Path - Fatal编程技术网

将URL路径与path.Join()组合

将URL路径与path.Join()组合,url,go,path,Url,Go,Path,在Go中是否有一种方法可以像使用path.Join()组合文件路径一样组合URL路径 例如,参见 当我使用path.Join(“http://foo“,“bar”),我得到http:/foo/bar 请参见。函数路径。Join需要的是路径,而不是URL。解析URL以获取路径并使用该路径连接: u, err := url.Parse("http://foo") u.Path = path.Join(u.Path, "bar.html") s := u.String() // prints http

在Go中是否有一种方法可以像使用
path.Join()组合文件路径一样组合URL路径

例如,参见

当我使用
path.Join(“http://foo“,“bar”)
,我得到
http:/foo/bar


请参见。

函数路径。Join需要的是路径,而不是URL。解析URL以获取路径并使用该路径连接:

u, err := url.Parse("http://foo")
u.Path = path.Join(u.Path, "bar.html")
s := u.String() // prints http://foo/bar.html

如果要组合的路径(例如,方案或主机)多于该路径,或者字符串多于该路径(例如,它包含一个查询字符串),则使用

接受的答案不适用于包含.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))
}

我编写了这个实用程序函数,用于我的目的:

func Join(basePath string, paths ...string) (*url.URL, error) {

    u, err := url.Parse(basePath)

    if err != nil {
        return nil, fmt.Errorf("invalid url")
    }

    p2 := append([]string{u.Path}, paths...)

    result := path.Join(p2...)

    u.Path = result

    return u, nil
}

一个简单的方法是修剪你不想要的/,然后加入。下面是一个func示例

func JoinURL(base string, paths ...string) string {
    p := path.Join(paths...)
    return fmt.Sprintf("%s/%s", strings.TrimRight(base, "/"), strings.TrimLeft(p, "/"))
}
用法将是

b := "http://my.domain.com/api/"
u := JoinURL(b, "/foo", "bar/", "baz")
fmt.Println(u)

这消除了检查/返回错误的需要

要将一个
URL
与另一个
URL
或路径连接,有:

Parse解析接收方上下文中的URL。提供的URL 可以是相对的或绝对的。解析在解析失败时返回
nil
err
, 否则其返回值与
resolverence
相同


这个答案正确地解释了
u.String()
ResolveReference
之间的细微差别,我相信这在Windows上是不正确的,它将与“\”而不是“/”@CodyA.Ray连接。代码在Windows上正常工作。如包文档的第一段所述,使用正斜杠分隔路径。该包在Windows上使用反斜杠,但这不是此答案中使用的包。@CeriseLimón但这是否意味着在Windows上运行时生成的URL看起来像“\bar.html”,而不是预期的“?@CodyA.Ray”路径包在所有平台上都使用正斜杠分隔的路径。
path.Join(u.path,“bar.html”)
生成的路径在所有平台(包括Windows)上都是
“/foo/bar.html”
。连接实现中的路径包。
func (u *URL) Parse(ref string) (*URL, error)
func TestURLParse(t *testing.T) {
    baseURL, _ := url.Parse("http://foo/a/b/c")

    url1, _ := baseURL.Parse("d/e")
    require.Equal(t, "http://foo/a/b/d/e", url1.String())

    url2, _ := baseURL.Parse("../d/e")
    require.Equal(t, "http://foo/a/d/e", url2.String())

    url3, _ := baseURL.Parse("/d/e")
    require.Equal(t, "http://foo/d/e", url3.String())
}