Go言語のハンドラ関数の作り方とリクエスト処理の流れ
先生と生徒の会話形式で理解しよう
生徒
「Go言語でWebアプリを作るときにハンドラ関数って何ですか?」
先生
「ハンドラ関数とは、ブラウザからのリクエストを受け取って処理する関数のことです。」
生徒
「どうやってリクエストを受け取って処理するんですか?」
先生
「Goではnet/httpパッケージを使って、URLごとにハンドラ関数を登録することで処理できます。」
生徒
「具体的な作り方を教えてください!」
先生
「それでは、順を追って説明しますね。」
1. ハンドラ関数の基本
ハンドラ関数は、http.ResponseWriterと*http.Requestの二つの引数を受け取ります。ResponseWriterはブラウザに返すデータを作るためのもので、Requestはリクエストの内容を取得するための構造体です。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "こんにちは、GoのWebアプリ!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
(ブラウザでhttp://localhost:8080にアクセスすると、「こんにちは、GoのWebアプリ!」と表示されます)
2. リクエスト処理の流れ
ブラウザからURLにアクセスすると、GoのWebサーバーがそのリクエストを受け取ります。そして、http.HandleFuncで登録したURLパスに対応するハンドラ関数が呼び出されます。
ハンドラ関数内で、リクエストの内容に応じて表示内容を変えたり、データベースと連携した処理を行ったりすることができます。
3. URLごとに異なる処理を設定する
複数のURLに対して異なるハンドラ関数を設定することで、Webアプリに複数のページを持たせることができます。
package main
import (
"fmt"
"net/http"
)
func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "ホームページです")
}
func aboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "このサイトについて")
}
func main() {
http.HandleFunc("/", homeHandler)
http.HandleFunc("/about", aboutHandler)
http.ListenAndServe(":8080", nil)
}
(http://localhost:8080/はホームページ、http://localhost:8080/aboutは「このサイトについて」と表示されます)
4. リクエストの種類を判別する
HTTPリクエストにはGETやPOSTなどの種類があります。ハンドラ関数内でr.Methodを確認することで、リクエストの種類ごとに処理を分けることができます。
func handler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
fmt.Fprintln(w, "GETリクエストを受け取りました")
} else if r.Method == "POST" {
fmt.Fprintln(w, "POSTリクエストを受け取りました")
}
}
5. ハンドラ関数作成のポイント
- ハンドラ関数は
ResponseWriterと*Requestを引数に持つ - URLごとに
http.HandleFuncで登録する - リクエストの種類(GETやPOST)を
r.Methodで判別できる - 処理は必要に応じて分岐させて柔軟に対応する
これらの基本を理解すれば、Go言語でWebアプリを作る際のハンドラ関数の仕組みが理解できます。まずは簡単なページから始めて、少しずつ複雑なリクエスト処理に挑戦してみましょう。