url.ParseQuery适用于纯query字符串解析,返回map[string][]string并自动解码;完整URL需先url.Parse再取RawQuery解析;解析表单体同理,应避免req.ParseForm的副作用;需用values.Has或len判断参数是否存在而非仅依赖Get返回空字符串。
Go 里用
解析 query string 最直接
如果你拿到的是纯 query 字符串(比如
),
是最轻量、最常用的方式。它返回
,自动处理重复 key 和 URL 解码。
注意:它不处理完整 URL,只吃 query 部分;如果传入带
的字符串(如
),会报错
—— 因为
不是合法的 query 字符。
+
是解析完整 URL 的标准组合
当你面对的是完整 URL(如
),必须先用
解析结构,再从
的
字段提取 query 字符串,最后交给
。
别直接用
—— 它返回的是已解码后的
,但会丢失原始
编码
细节(比如空格被转成
还是
),且无法区分
和
(后者在
中视为
,而
会忽略无值 key)。
立即学习
“
go语言免费学习笔记(深入)
”;
保留原始
字节
,适合二次解析或透传
适合快速读取,但语义模糊:它把
和
都当成
如果 URL 含非法字符(如未编码的空格),
会失败,需提前清理或容错
手动处理
body 时也用
HTTP POST 的表单数据(
)和 query string 格式完全一致,所以解析逻辑复用 —— 直接读
,再传给
即可。
React Native For Android 源码编译 中文WORD版
本文档主要讲述的是React Native For Android 源码编译;希望对大家会有帮助;感兴趣的朋友可以过来看看
下载
常见错误:调用
后反复访问
,看似方便,实则有坑:
它会自动调用
(即使不是 multipart),影响后续读取
它把 query 和 body 混在一起塞进
,容易误读来源
若 body 已被读过(如中间件提前解析),
会静默失败,
为空
更可控的做法是跳过
,自己读 body 并解析:
中文、特殊字符和空值的边界情况必须测试
URL 参数中常见的
,对应三种语义:
→ 解码后是
(
自动做)
→
,
返回
(无等号)→
,行为和
一致
这意味着你无法单靠
判断参数是否存在 —— 它可能是空字符串、缺失、或只有 key 名。真要区分,得查
或用
(Go 1.19+)。
另外,
、控制字符、超长 key 等异常输入可能触发解析失败,生产环境建议加
判断,而非忽略。
url.ParseQuery"name=alice&age=30&tags=go&tags=web"url.ParseQuerymap[string][]string?"?name=alice"invalid URL escape?query := "name=alice&age=30&tags=go&tags=web"
values, err := url.ParseQuery(query)
if err != nil {
log.Fatal(err)
}
fmt.Println(values.Get("name")) // "alice"(取第一个)
fmt.Println(values["tags"]) // ["go" "web"]
fmt.Println(values.Get("missing")) // ""(空字符串,不会 panic)url.Parse.RawQuery"https://example.com/search?q=go&lang=zh"url.Parse*url.URLRawQueryurl.ParseQueryu.Query()Values+%20key=keyParseQuerykey=""u.Query()u.RawQueryu.Query()key=keykey=""url.Parseapplication/x-www-form-urlencodedurl.ParseQueryContent-Type: application/x-www-form-urlencodedreq.Bodyurl.ParseQueryreq.ParseForm()req.PostFormParseMultipartFormBodyreq.FormParseFormPostFormParseFormbody, _ := io.ReadAll(req.Body)
values, _ := url.ParseQuery(string(body))
name := values.Get("name")name=%E4%BD%A0%E5%A5%BD&empty=&blankname=%E4%BD%A0%E5%A5%BD"你好"ParseQueryempty=values["empty"] == []string{""}Get("empty")""blankvalues["blank"] == []string{""}blank=values.Get(k) == ""len(values[k]) > 0values.Has(k)%00err