*11/7 kyoh86さんに指摘して頂いた部分を修正致しました。
はじめに
Goでクエリパラメータ(クエリ文字列)をパースしたかったのだが、ソースを見る以外情報が見つからなかったのでメモ。
結論
net/urlのQueryメソッドを呼ぶことでmap[string][]string
型にパースできます。
import "net/url"
u, _ := url.Parse("https://xxx.com?a=AAA&b=BBB&c=CCC&d=DDD")
query := u.Query()
// query -> map[a:[AAA] b:[BBB] c:[CCC] d:[DDD]]
解説
Queryメソッドのソースを確認してみると、RawQueryフィールドをParseQueryに渡していることがわかります。
// Query parses RawQuery and returns the corresponding values.
// It silently discards malformed value pairs.
// To check errors use ParseQuery.
func (u *URL) Query() Values {
v, _ := ParseQuery(u.RawQuery)
return v
}
RawQueryフィールド
net/url.URL構造体は、RawQueryというstringフィールドを持っており、生クエリを保持しています。
ソースコードには以下のように記載されています。
RawQuery string // encoded query values, without '?'
ParseQuery関数
net/url#ParseQueryは、map[string][]string
型の値を返します。
公式リファレンスには以下のように記載されています。
ParseQueryはURLエンコードされたクエリ文字列を解析し、各キーに指定された値をリストしたマップを返します。 ParseQueryは常に見つかったすべての有効なクエリパラメータを含む非nilマップを返します。 errがもしあれば、遭遇した最初の復号誤りを記述します。
クエリは、アンパサンドまたはセミコロンで区切られたkey = valueの設定のリストであると予想されます。 等号のない設定は、空の値に設定されたキーとして解釈されます。