本文我们将讨论如何用Go对URL参数进行添加、修改或删除。用一个例子来说明,看看怎么能将以下URL:
https://example.com?name=alice&age=28&gender=female
转变为:
https://example.com?name=alice&age=29&occupation=carpenter
如果你想改变URL查询字符串:
func main() {
//使用url.Parse()函数将字符串解析成*url.URL类型。
//如果URL已经是url.URL类型可以跳过这一步。
urlA, err := url.Parse("https://example.com?name=alice&age=28&gender=female")
if err != nil {
log.Fatal(err)
}
//使用Query()方法获取URL中的查询字符串参数,存在map类型中。
values := urlA.Query()
//使用Add(), Set(), Del()方法来修改返回查询参数, 本质上就是对map的修改
//可以使用Get(), Has()方法来查询或检查是否包含对应参数
values.Add("occupation", "carpenter")
values.Del("gender")
values.Set("age", strconv.Itoa(29))
//使用Encode()方法将map转为URL格式的字符串(类似"age=29&name=alice...")
//然后将新的查询参数赋值到URL对象的查询参数字段
urlA.RawQuery = values.Encode()
fmt.Printf("urlA: %s", urlA.String())
}
上面的代码执行结果为:
urlA: https://example.com?age=29&name=alice&occupation=carpenter
如果你希望使用不同的查询参数来克隆一个新URL,同时保持原来的URL不变的话,你需要拷贝一份原来的url.URL结构体。有好几种方法来实现。
方法1:
url0, _ := url.Parse("[https://hey.com/?was=true](https://hey.com/?was=true)")
url1, _ := url.Parse(uri0.String())
url1是url0的一份深度拷贝。
方法2:
urlA, _ :=url.Parse("https://example.comname=alice&age=28&gender=female")
newUrl := urlA
fmt.Println(&urlA, &newUrl)
执行结果会发现两个地址不一样的,这样你就创建了一个新的url.URL变量,内容和原来的url相同。
将前面的代码合并起来,就可以使用不同的查询参数创建一个新的URL:
urlA, err := url.Parse("https://example.com?name=alice&age=28&gender=female")
if err != nil {
log.Fatal(err)
}
// 拷贝原url.URL.
urlB := *urlA
// 对新url.URL类型进行参数更改…
values := urlB.Query()
values.Add("occupation", "carpenter")
values.Del("gender")
values.Set("age", strconv.Itoa(29))
urlB.RawQuery = values.Encode()
fmt.Printf("urlA: %s\n", urlA.String()) // This will be unchanged.
fmt.Printf("urlB: %s\n", urlB.String()) // This will have the new params.
执行结果:
urlA: https://example.com?name=alice&age=28&gender=female
urlB: https://example.com?age=29&name=alice&occupation=carpenter
顺便说一下,你可以在任何时候使用这项技术来“克隆”一个URL并对其进行修改。例如,创建一个不同路径的URL,你可以这样做:
urlA, err := url.Parse("https://example.com/foo")
if err != nil {
log.Fatal(err)
}
urlB := *urlA
urlB.Path = "/bar"
fmt.Printf("%s\n", urlA.String()) // Prints https://example.com/foo
fmt.Printf("%s\n", urlB.String()) // Prints https://example.com/bar
网友评论