Go言語のサードパーティ製ルーターを活用したルーティング方法!chi・gorilla/mux入門
生徒
「先生、Go言語で複雑なWebアプリを作るとき、標準のServeMuxだとURLの管理が大変そうです。もっと便利な方法はありますか?」
先生
「そうですね。そんなときは、Go言語のサードパーティ製ルーターを使うと便利です。代表的なものにchiやgorilla/muxがあります。」
生徒
「サードパーティ製ルーターって何ですか?」
先生
「標準ライブラリ以外で提供されているルーターのことで、より柔軟で便利なルーティング機能を提供してくれます。複雑なURLやパラメータ付きのルーティングも簡単に設定できます。」
生徒
「具体的にどうやって使うんですか?」
先生
「では、基本的な使い方を見ていきましょう!」
1. chiルーターの基本的な使い方
まず、chiは軽量でシンプルなGo言語向けのサードパーティ製ルーターです。ルーティングの設定が簡単で、パスパラメータやミドルウェアの利用も容易です。
package main
import (
"fmt"
"net/http"
"github.com/go-chi/chi/v5"
)
func main() {
r := chi.NewRouter()
r.Get("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "こんにちは、chiルーターの世界!")
})
r.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) {
id := chi.URLParam(r, "id")
fmt.Fprintf(w, "ユーザーID: %s\n", id)
})
http.ListenAndServe(":8080", r)
}
上の例では、/helloにアクセスすると固定メッセージが返り、/user/{id}ではURLからユーザーIDを取得して表示できます。chi.URLParamで簡単にパスパラメータを取り出せるのが便利です。
2. gorilla/muxルーターの基本的な使い方
gorilla/muxはGo言語で最も有名なサードパーティ製ルーターの一つで、パスパラメータや正規表現マッチなど強力なルーティング機能があります。
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
r.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "こんにちは、gorilla/muxルーター!")
}).Methods("GET")
r.HandleFunc("/user/{id}", func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
fmt.Fprintf(w, "ユーザーID: %s\n", vars["id"])
}).Methods("GET")
http.ListenAndServe(":8080", r)
}
この例では、mux.Vars(r)でURLのパスパラメータを取得し、ユーザーIDを表示できます。HTTPメソッドを指定できるので、GETやPOSTごとに処理を分けることも簡単です。
3. サードパーティ製ルーターを使うメリット
標準のServeMuxと比べて、サードパーティ製ルーターには次のようなメリットがあります。
- パスパラメータやクエリパラメータの取得が簡単。
- HTTPメソッドごとのルーティングが明確。
- 中間処理(ミドルウェア)の挿入が容易で、認証やログ処理などに便利。
- 複雑なURL構造でも整理しやすく、大規模なWebアプリ開発に向いている。
chiは軽量で高速、gorilla/muxは機能が豊富で柔軟、といった特徴があり、用途に応じて選ぶと良いでしょう。
4. 実践的な活用例
例えば、ブログアプリで記事一覧ページや記事詳細ページを作る場合、chiやgorilla/muxを使うとURLごとに処理を整理できます。
r.Get("/articles", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "記事一覧ページ")
})
r.Get("/articles/{slug}", func(w http.ResponseWriter, r *http.Request) {
slug := chi.URLParam(r, "slug")
fmt.Fprintf(w, "記事ページ: %s\n", slug)
})
このようにURL構造を整理すると、Webアプリの拡張やメンテナンスがしやすくなります。
5. ミドルウェアを使った共通処理の追加
chiやgorilla/muxといったサードパーティ製ルーターの大きな魅力の一つが、ミドルウェアを簡単に追加できる点です。 ミドルウェアとは、リクエストを処理する前後に共通の処理を挟み込む仕組みで、 ログ出力や認証チェック、アクセス制御などによく使われます。 標準のServeMuxでは自前で工夫が必要ですが、サードパーティ製ルーターでは直感的に扱えます。
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("アクセス:", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
r := chi.NewRouter()
r.Use(loggingMiddleware)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "トップページ")
})
http.ListenAndServe(":8080", r)
}
この例では、すべてのリクエストに対してアクセスログを出力しています。 ミドルウェアを使うことで、各ハンドラに同じ処理を書く必要がなくなり、 コード全体がすっきり整理されます。
6. グループルーティングでURL構造を整理する
Webアプリが大きくなってくると、URLの数も増えて管理が大変になります。 chiやgorilla/muxでは、ルートをグループ化することで、 関連するURLをまとめて定義できます。 APIや管理画面など、役割ごとにURLを分けたい場合に非常に便利です。
r.Route("/admin", func(r chi.Router) {
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "管理画面トップ")
})
r.Get("/users", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "ユーザー管理ページ")
})
})
このようにグループ化することで、/admin配下のURLが一目で分かるようになります。
URL設計を整理しておくと、後から機能を追加する際も迷いにくくなります。
7. 標準ルーターとの使い分けを考える
サードパーティ製ルーターは非常に便利ですが、すべての場面で必須というわけではありません。 小規模なWebサーバーや簡単な検証用ツールであれば、標準のServeMuxでも十分なケースがあります。 一方で、URLが増えたり、認証やログ処理が必要になったりした段階で、 chiやgorilla/muxを導入すると、その効果を実感しやすくなります。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "標準ルーターのシンプルな例")
})
http.ListenAndServe(":8080", nil)
まずは標準ルーターで基礎を理解し、アプリが成長してきたらサードパーティ製ルーターを使う、 という段階的な学習方法もおすすめです。 それぞれの特徴を理解して使い分けることが、Go言語でのWeb開発をスムーズに進めるコツです。
まとめ
サードパーティ製ルーターを使ったルーティングの全体像
この記事では、Go言語でWebアプリケーションを開発する際に役立つ、 サードパーティ製ルーターであるchiとgorilla/muxについて、基本から実践的な使い方までを順を追って解説してきました。 標準ライブラリのServeMuxでもWebサーバーを構築することは可能ですが、 URLの数が増えたり、パスパラメータやHTTPメソッドごとの分岐が必要になったりすると、 管理が複雑になりやすいという課題があります。 その点、chiやgorilla/muxのようなサードパーティ製ルーターを使うことで、 ルーティング定義が整理され、可読性と保守性の高いコードを書くことができます。
chiは軽量でシンプルな設計が特徴で、初めてサードパーティ製ルーターを使う人でも理解しやすく、 小規模から中規模のWebアプリケーションに向いています。 一方、gorilla/muxは長年利用されてきた実績があり、 正規表現を使った柔軟なルーティングやHTTPメソッド制御など、より細かい制御が可能です。 どちらもGo言語のWeb開発では定番の選択肢であり、用途や開発規模に応じて選ぶことが重要です。
ミドルウェアとグループルーティングの重要性
記事の後半では、ミドルウェアやグループルーティングといった、 実際のWebアプリ開発で頻繁に使われる機能についても紹介しました。 ミドルウェアを使うことで、アクセスログの出力や認証処理、共通の前処理・後処理を一箇所にまとめられます。 これにより、各ハンドラ関数に同じコードを書く必要がなくなり、 コードの重複を防ぎながら、処理の流れを把握しやすくなります。
また、グループルーティングを使えば、 管理画面やAPIなど、役割ごとにURL構造を整理できます。 URL設計を明確にしておくことは、機能追加や仕様変更が発生したときに大きな助けになります。 小さなアプリのうちから、URLの整理や設計を意識しておくことで、 将来的に規模が大きくなっても対応しやすい構成を保てます。
振り返り用のシンプルなサンプルコード
最後に、これまで学んだ内容を振り返るためのシンプルなサンプルコードを見てみましょう。 パスパラメータとミドルウェアを組み合わせた、基本的な構成です。 実際に手を動かして動作を確認することで、理解がより深まります。
package main
import (
"fmt"
"net/http"
"github.com/go-chi/chi/v5"
)
func simpleMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Println("リクエストURL:", r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
r := chi.NewRouter()
r.Use(simpleMiddleware)
r.Get("/hello/{name}", func(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
fmt.Fprintf(w, "こんにちは、%s さん", name)
})
http.ListenAndServe(":8080", r)
}
このコードでは、URLに含まれる名前を使ってメッセージを表示しています。 同時にミドルウェアでリクエスト情報を出力しているため、 ルーティングと共通処理の流れを一度に確認できます。 小さなサンプルでも、実際のWebアプリ開発で使われる要素が詰まっています。
生徒
「今回の記事を通して、Go言語でのルーティングがだいぶ分かってきました。 標準のServeMuxよりも、chiやgorilla/muxを使うとURL管理がすごく楽になりますね。」
先生
「そうですね。特にパスパラメータやミドルウェアは、 実際のWebアプリでは欠かせない要素です。 最初は難しく感じるかもしれませんが、仕組み自体はとてもシンプルですよ。」
生徒
「URLをグループ化したり、共通処理をまとめたりできるのも便利だと思いました。 アプリが大きくなっても、整理された状態を保てそうです。」
先生
「その気づきはとても大切です。 小さいうちから設計を意識しておくと、後で困ることが少なくなります。 まずは簡単なWebアプリを作りながら、ルーターの使い方に慣れていきましょう。」
生徒
「はい。次は認証やAPIっぽい構成にも挑戦してみたいです。 今日学んだ内容をベースに、少しずつレベルアップしていきます。」
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!