Edited at

【Go】URLクエリパラメータをパースする

More than 1 year has passed since last update.

*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に渡していることがわかります。


net/url/url.go

// 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フィールドを持っており、生クエリを保持しています。

ソースコードには以下のように記載されています。


net/url/url.go

RawQuery   string    // encoded query values, without '?'



ParseQuery関数

net/url#ParseQueryは、map[string][]string型の値を返します。

公式リファレンスには以下のように記載されています。


ParseQueryはURLエンコードされたクエリ文字列を解析し、各キーに指定された値をリストしたマップを返します。 ParseQueryは常に見つかったすべての有効なクエリパラメータを含む非nilマップを返します。 errがもしあれば、遭遇した最初の復号誤りを記述します。

クエリは、アンパサンドまたはセミコロンで区切られたkey = valueの設定のリストであると予想されます。 等号のない設定は、空の値に設定されたキーとして解釈されます。