net/urlを利用してGoでURL文字列を解析や生成する

Go言語
この記事は約6分で読めます。
Go初学者
Go初学者

GoでURLに関する標準パッケージってあるの?

この記事では標準パッケージ net/url について理解できます!
  • URL文字列を解析する方法について
  • URL文字列を生成する方法について

Goの標準パッケージ・net/url についてお伝えしていきます。

WEBアプリ開発でURLを解析する場面が多々ありますので押さえておきましょう!

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

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の文字列を解析や生成する処理を行いました。

それでは、まとめにはいりましょう。

この記事のポイント!
  • net/url はURLの文字列を解析や生成する処理を行う標準パッケージ
  • url.Parse() はURL文字列を解析してURL型の構造体を作成する
  • url.URL{} はURLの文字列を生成する
    1. url.URL{} を定義する時はポインタ型が一般的
    2. url.URL{} ではエンコードが必要
    3. エンコードにより日本語もパーセントエンコーディングされる

以上です。

今回の内容は構造体の基本を押さえておけば、そんなに難しくはないと思います。

私がWEBアプリのプログラムコードを写経していて、よく url.Parse() を見かける場面が多かったので記事にしました。

コードの意味を理解して写経するのと、ただ写経するのでは理解度も全然違ってきますよ。

もりぴ
もりぴ

私も記事を書きながら復習になりましたよ!

comment

  1. taro より:

    とあるUdemyの講座で説明が難しく、ググってるとここの記事に辿り着きました。

    1つ1つ何をしているのかを明確にして頂いていて非常に分かりやすかったです。

    ありがとうございます!!

    • もりぴ もりぴ より:

      taro 様

      コメントありがとうございます。
      正直嬉しいです。

      私もGo言語はUdemyで学習しましたが、初心者向けと謳っていても先に進むにつれて難易度が一気にアップしますね。

      私も理解に苦しんだひとりです。

      今回の記事は長文になってもいいから「分解」して解説することに気をくばりました。

      伝わってくれて、本当に嬉しいし感謝です。
      ありがとうございます。

タイトルとURLをコピーしました