
GoでURLに関する標準パッケージってあるの?
Goの標準パッケージ・net/url
についてお伝えしていきます。
WEBアプリ開発でURLを解析する場面が多々ありますので押さえておきましょう!
Goの標準パッケージ・net/urlとは?
Goの標準パッケージ・net/url
は、URLの文字列を解析や生成する処理を行います。
イメージとしては「URLを分解してそれぞれの値を活用していく」感じでしょう。

あまり難しく考えることはないですよ。
それでは、プログラムで確認していきましょう。
URL文字列を解析する・url.Parse()
URLの文字列を解析するには url.Parse()
を使用します。
url.Parse()
は、引数にURLを渡すことでURL文字列を解析してURL型の構造体を作成します。
では、url.Parse()
でURLを解析して、構造体の値を出力してみましょう。
package main
import (
"fmt"
"net/url"
)
func main() {
// URLの解析 url.Parse()
// 引数にURLを渡す
u, _ := url.Parse("https://golangstart.com/serch?a=1&b=2#top")
fmt.Println(u.Scheme) // http
fmt.Println(u.Host) // golangstart.com
fmt.Println(u.Path) // /serch
fmt.Println(u.RawQuery) // a=1&b=2
fmt.Println(u.Fragment) // top
// mapで出力
fmt.Println(u.Query()) // map[a:[1] b:[2]]
}
// 出力結果
$ go run main.go
https
golangstart.com
/serch
a=1&b=2
top
map[a:[1] b:[2]]
url.Parse()
でURLの文字列を解析して、構造体としてデータが net/url
で用意されているフィールドの値が代入されていることが確認できます。

ちなみに Query
とは「問い合わせる」「訪ねる」という意味です。
URLを生成する・url.URL{}
url.Parse()
の逆で url.URL{}
を使用することでURLを生成することができます。
url.URL{}
は構造体であるところがポイントです。
簡単なURLを生成する
まずは一般的なURLを生成してみましょう。
package main
import (
"fmt"
"net/url"
)
func main() {
// URLを生成
url := &url.URL{} // ポインタ型で指定するのが一般的
url.Scheme = "https"
url.Host = "golang.com"
fmt.Println(url)
}
// 出力結果
$ go run main.go
https://golangstart.com
url.Parse()
と同様のフィールド名でURLを生成することができました。
Queryを追加してURLを生成する
次に Query
を追加してURLを生成してみましょう。
package main
import (
"fmt"
"net/url"
)
func main() {
// URLを生成
url := &url.URL{} // ポインタ型で指定するのが一般的
url.Scheme = "https"
url.Host = "golang.com"
fmt.Println(url)
// Queryを追加
q := url.Query()
// mapで生成する
q.Set("q", "morip")
// mapで出力
fmt.Println(q)
// 必ずエンコードが必要
url.RawQuery = q.Encode()
fmt.Println(url)
}
// 出力結果
$ go run main.go
https://golangstart.com
map[q:[morip]]
https://golangstart.com?q=morip
Query
付きでURLが生成されました。
q.Set("q", "morip")
でmap形式でKeyに q
Valueに morip
が代入されます。
url.RawQuery = q.Encode()
によりエンコードされて、ひとつのURLが生成されます。
エンコードすることで日本語も対応できる
エンコードすることで日本語の値にも対応させることができます。
package main
import (
"fmt"
"net/url"
)
func main() {
// URLを生成
url := &url.URL{} // ポインタ型で指定するのが一般的
url.Scheme = "https"
url.Host = "golang.com"
fmt.Println(url)
// Queryを追加
q := url.Query()
// mapで生成する
q.Set("q", "もりぴ") // 日本語を指定する
// mapで出力
fmt.Println(q)
// 必ずエンコードが必要
url.RawQuery = q.Encode()
fmt.Println(url)
}
// 出力結果
$ go run main.go
https://golangstart.com
map[q:[もりぴ]]
https://golangstart.com?q=%E3%82%82%E3%82%8A%E3%81%B4
Valueに もりぴ
と日本語にしても url.RawQuery = q.Encode()
によりパーセントエンコーディングされてURLとして利用可能になります。
【まとめ】URLの文字列を解析や生成する処理を行う
今回はGoの標準パッケージ・net/url
でURLの文字列を解析や生成する処理を行いました。
それでは、まとめにはいりましょう。
以上です。
今回の内容は構造体の基本を押さえておけば、そんなに難しくはないと思います。
私がWEBアプリのプログラムコードを写経していて、よく url.Parse() を見かける場面が多かったので記事にしました。
コードの意味を理解して写経するのと、ただ写経するのでは理解度も全然違ってきますよ。

私も記事を書きながら復習になりましたよ!
comment
とあるUdemyの講座で説明が難しく、ググってるとここの記事に辿り着きました。
1つ1つ何をしているのかを明確にして頂いていて非常に分かりやすかったです。
ありがとうございます!!
taro 様
コメントありがとうございます。
正直嬉しいです。
私もGo言語はUdemyで学習しましたが、初心者向けと謳っていても先に進むにつれて難易度が一気にアップしますね。
私も理解に苦しんだひとりです。
今回の記事は長文になってもいいから「分解」して解説することに気をくばりました。
伝わってくれて、本当に嬉しいし感謝です。
ありがとうございます。