Go 语言 net/url 包通过 url.URL 结构体和 url.Parse() 等函数提供安全的 URL 解析与构造能力,自动解码路径和查询参数(不含 fragment),推荐检查 error;修改 Path 应用 url.PathEscape(),查询参数需通过 u.Query() 操作后 Encode() 赋值;拼接相对路径应使用 ResolveReference();编码须区分 url.PathEscape() 和 url.QueryEscape()。

Go 语言的 net/url 包提供了完整、安全的 URL 解析与构造能力,核心是 url.URL 结构体和配套的解析/编码函数。正确使用它,能避免手动字符串切割带来的错误(比如路径中含 %、/ 或查询参数含特殊字符)。
解析 URL 字符串为 url.URL 结构体
用 url.Parse() 将字符串转为可操作的对象。它会自动解码路径和查询参数中的百分号编码(如 %20 → 空格),但不会解码 fragment(# 后部分)。
- 成功时返回 *url.URL 和 nil 错误;失败(如格式非法)则返回 nil 和 error
- 推荐始终检查 error,尤其在处理用户输入或外部数据时
- 示例:u, err := url.Parse("https://user:pass@host.com:8080/path/to/page?name=go+lang&v=1.21#top")
安全获取和修改 URL 各个组成部分
url.URL 的字段(如 Scheme、Host、Path、RawQuery)可直接读取。修改时注意:
- 修改
Path前建议用url.PathEscape()编码,避免注入斜杠或点遍历 - 查询参数应通过
u.Query()获取url.Values(本质是 map[string][]string),再用Set/Add/Del操作,最后赋回u.RawQuery = q.Encode() - 不要直接拼接字符串改
RawQuery,易出编码错误
构造新 URL 或拼接相对路径
从零构建可用 &url.URL{Scheme: "https", Host: "api.example.com", Path: "/v1/users"},再调用 u.String() 得字符串。
立即学习“go语言免费学习笔记(深入)”;
- 拼接相对路径(如从 base URL 构建子路径)用
baseURL.ResolveReference(relURL),比字符串拼接更可靠 - 例如 base 是 https://a.com/b/c,rel 是 ./d → https://a.com/b/d;rel 是 /e → https://a.com/e
编码与解码:url.PathEscape / url.PathUnescape 和 url.QueryEscape / url.QueryUnescape
路径和查询参数的编码规则不同,必须区分使用:
-
url.PathEscape(s):对路径段编码(保留/、:等分隔符,只编码语义字符) -
url.QueryEscape(s):对查询值编码(空格→+,其余→%xx) - 解码统一用
url.PathUnescape或url.QueryUnescape,它们可处理多种编码变体
基本上就这些。net/url 不复杂但容易忽略编码细节,坚持用结构体方法而非字符串操作,URL 处理就稳了。









