Go 1.22のHTTPルーティング改善について
自然言語でも日本語という母語があるように、プログラミングでも自分の母語と呼べる言語を持ちたいと考え、最近はGoを本腰入れて勉強しています。その中で HTTP サーバーを実装しようとした際、Gin・Echo・chi など多くの選択肢があり、どのフレームワーク(ライブラリ)を選ぶべきか迷いました。 そんな中、Go 1.22(2024年2月リリース)から標準ライブラリのhttp.ServeMuxが強化されたことを知りました。 この改善により、多くのケースでサードパーティのライブラリが不要になっています。 この記事では、Go 1.22で追加されたServeMuxの新機能について、実例を交えながら解説します。 これまでのServeMux(Go 1.21以前)の課題 Go 1.21以前のServeMuxには、以下のような制約がありました。 HTTPメソッドを指定できない // Go 1.21以前: HTTPメソッドの区別ができない mux := http.NewServeMux() mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { // GET、POST、PUT、DELETEなど、すべてのHTTPメソッドがこのハンドラに来る // 自分でメソッドを判定する必要があった switch r.Method { case http.MethodGet: // GETの処理 case http.MethodPost: // POSTの処理 default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } }) このように、メソッドごとに処理を分けたい場合は、自分でswitch文を書く必要がありました。 パスパラメータを扱えない // Go 1.21以前: パスパラメータが使えない // /users/123 のような動的なパスを扱うには、自分でパースが必要 mux.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) { // URLからIDを手動で抽出する必要があった id := strings.TrimPrefix(r.URL.Path, "/users/") fmt.Fprintf(w, "User ID: %s", id) }) 完全一致が難しい // Go 1.21以前: /users にアクセスしたかったが、/users/ も /users/abc もマッチしてしまう mux.HandleFunc("/users", handler) // これは /users だけでなく /users/ にもマッチする こうした課題から、多くのプロジェクトでサードパーティのルーターライブラリが使われていました。 ...