Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
http.ServeMux
『http.ServeMux』はGoのURLルーターです。URLパターンとハンドラーを対応付け、リクエストを適切なハンドラーに振り分けます。
構文
// デフォルトのマルチプレクサにルートを登録する
http.HandleFunc("/パス", ハンドラー関数)
// 独自の ServeMux を作成する(推奨)
mux := http.NewServeMux()
mux.HandleFunc("/パス", ハンドラー関数)
// カスタム ServeMux を使ってサーバーを起動する
http.ListenAndServe(":8080", mux)
関数一覧
| 関数 / メソッド | 概要 |
|---|---|
| http.NewServeMux() | 新しい ServeMux(マルチプレクサ)を作成します。複数のサーバーを立てる場合や独立したルーティングが必要な場合に使います。 |
| mux.HandleFunc(pattern, handler) | URLパターンにハンドラー関数を登録します。 |
| mux.Handle(pattern, handler) | URLパターンに http.Handler インタフェースを実装したオブジェクトを登録します。 |
| http.StripPrefix(prefix, handler) | パスの先頭からプレフィックスを除去してから次のハンドラーに渡します。静的ファイル配信などで使います。 |
| http.FileServer(root) | ディレクトリ内のファイルを配信する Handler を作成します。 |
サンプルコード
package main
import (
"fmt"
"log"
"net/http"
)
func homeHandler(w http.ResponseWriter, r *http.Request) {
// ServeMux は "/" に完全一致しないパスも "/" にマッチする
// r.URL.Path で実際のパスを確認できる
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
fmt.Fprintln(w, "トップページ")
}
func apiHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
fmt.Fprintln(w, `{"message":"API レスポンス"}`)
}
func main() {
// 独自の ServeMux を作成する
mux := http.NewServeMux()
// ルートを登録する
mux.HandleFunc("/", homeHandler)
mux.HandleFunc("/api/", apiHandler)
// 静的ファイルを /static/ で配信する
fs := http.FileServer(http.Dir("./static"))
mux.Handle("/static/", http.StripPrefix("/static/", fs))
fmt.Println("サーバー起動: http://localhost:8080")
log.Fatal(http.ListenAndServe(":8080", mux))
}
概要
Go 1.22以降、ServeMux のパターン構文が強化され、HTTPメソッドのマッチング(『GET /api/users』)やパスパラメータ(『/users/{id}』)が使えるようになりました。古いバージョンでは外部パッケージの『gorilla/mux』や『chi』がよく使われます。
デフォルトのパターン『"/"』はすべてのパスにマッチします。意図せず全パスをキャッチしないよう、404レスポンスを返す処理を入れてください。パターンがスラッシュで終わる場合(例: '/api/')はサブツリーマッチになり、前方一致で動作します。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。