コース一覧
    Go実践:並行処理とWeb API
    ハンドラ関数

    Go実践:並行処理とWeb API

    Goの並行処理とWeb API開発を組み合わせ、実践的なサービス構築へ進むコースです。

    1
    ゴルーチンと並行処理のさわり
    01. ゴルーチン15分
    02. チャネル20分
    03. 待ち合わせ20分
    04. 並行の落とし穴20分
    05. つくる: 並行集計20分
    06. 第7章クイズ10分
    2
    Web API(net/http)
    01. サーバーを立てる20分
    02. ハンドラ関数20分
    03. JSONを返す20分
    04. ルーティング20分
    05. 一覧API20分
    06. 詳細APIと40420分
    07. 出品API20分
    08. つくる: API主要部完成25分
    09. 第8章クイズ10分
    3
    総合制作
    01. 仕様互換を仕上げる25分
    02. Node版と差し替える25分
    03. 1バイナリでデプロイ25分
    04. 自由拡張25分
    05. 完成と次のステップ20分

    ハンドラ関数

    リクエストから読み取る

    前のレッスンでは応答を書くだけでした。今度は届いたリクエストの中身を見ます。

    Go

    func handler(w http.ResponseWriter, r *http.Request) {
    	r.Method       // "GET" や "POST"
    	r.URL.Path     // "/items"
    	r.URL.Query()  // クエリパラメータ
    }

    メソッドで分ける

    同じパスでも、メソッドが違えば別の操作です。

    Go

    func itemsHandler(w http.ResponseWriter, r *http.Request) {
    	if r.Method != "GET" {
    		w.WriteHeader(405)
    		w.Write([]byte("method not allowed"))
    		return
    	}
    	// GET のときの処理
    }

    405 は「そのメソッドは受け付けていません」という意味です。404(そんなパスは無い)とは違います。パスはあるがメソッドが違うときに使います。

    条件に合わないものを先に弾いて return する形は、第3章の continue と同じ考え方です。本筋の処理が右に寄りません。

    メソッド名は定数がある

    Go

    if r.Method != http.MethodGet {

    "GET" と直接書いても動きますが、http.MethodGet という定数が用意されています。綴りを間違えてもコンパイル時に気づけるのが利点です。第2章で iota の定数を作ったときと同じ理由です。

    クエリパラメータを読む

    プレーンテキスト

    GET /items?keyword=きのこ&limit=10

    Go

    q := r.URL.Query()
    keyword := q.Get("keyword")   // "きのこ"
    limit := q.Get("limit")       // "10"。文字列であることに注意

    Get は、無いときは空文字を返します。エラーにはなりません。

    Go

    keyword := q.Get("nothing")   // ""

    第5章のマップと同じで、ゼロ値が返ってきます。「指定が無い」と「空文字を指定した」を区別したいなら、別の方法が要ります。入門では空文字を「指定なし」として扱えば十分です。

    数値が欲しいときは、自分で変換します。

    Go

    import "strconv"
    
    n, err := strconv.Atoi(q.Get("limit"))
    if err != nil {
    	n = 10   // 変換できなければ既定値
    }

    Atoi は文字列を整数にする関数です。第4章でやった (値, error) の形をしています。変換できないときにエラーが返るので、既定値に倒すか 400 を返すかを選べます。

    要件

    1. メソッドが GET 以外なら 405 と method not allowed を返す
    2. GET なら 検索語: キーワード を返す
    3. キーワードが空なら 検索語: なし を返す
    4. WriteHeader は本文を書く前に呼ぶ

    ヒント

    最初に `if r.Method != http.MethodGet {` で弾き、`return` で抜けます

    クエリは `r.URL.Query().Get("keyword")` で取れます。無ければ空文字が返ります

    `w.WriteHeader(405)` は `w.Write` より前に書いてください。逆だと 200 で固定されます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/10

    関連レッスン

    • JSONを返す

      構造体タグを付けてJSONに変換し、Itemをきれいなキー名で返せるようになります。

    • ルーティング

      パスとメソッドで処理を分け、複数のエンドポイントを1つのサーバーに置けるようになります。

    • 一覧API

      コレクションを返し、クエリパラメータで絞り込めるGET /itemsを作れるようになります。

    • 詳細APIと404

      パスからIDを取り出して1件返し、見つからないときに404を返せるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
    • メソッドクラスに属する関数
    • 処理計算や代入を表す長方形
    • コンパイルソースをバイトコードへ変換する処理
    • クエリパラメータURL の `?` 以降に付ける `key=value` 形式のリクエストデータ
    • 関数処理に名前を付けて再利用できる単位
    main.go
    エディタを読み込んでいます

    メモ

    ハンドラ関数

    ⌘S で保存