1. キーワードあり
  2. キーワードなし
  3. POST は拒否
  4. DELETE も拒否
コース一覧
Go入門
ハンドラ関数

Go入門

変数とゼロ値、Go唯一のループであるfor、複数戻り値とエラー処理、スライスとマップ、構造体とメソッド、ゴルーチンによる並行処理、net/httpによるAPI開発まで、Goの基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIをGoで作りながら学びます。

1
Hello, Go
01. Goとは15分
02. 実行してみる15分
03. packageとmain15分
04. fmtで出力する15分
05. go buildと1バイナリ15分
06. つくる: 起動バナー20分
07. 第1章クイズ10分
2
変数と型
01. varで宣言する15分
02. := の短縮宣言15分
03. ゼロ値(Goならでは)15分
04. 基本の型15分
05. 暗黙変換なし15分
06. 定数とiota15分
07. つくる: 商品データ表示20分
08. 第2章クイズ10分
3
制御構文(forしかない世界)
01. Goのif15分
02. forしかない世界15分
03. forの七変化15分
04. Goのswitch15分
05. 定番: FizzBuzz15分
06. ループで集計15分
07. つくる: 商品集計20分
08. 第3章クイズ10分
4
関数とエラー処理
01. funcで関数を作る15分
02. 複数戻り値(Goならでは)15分
03. if err != nil(Goの心臓)15分
04. エラーを作る15分
05. deferで後始末15分
06. つくる: 検証つき関数群20分
07. 第4章クイズ10分
5
スライスとマップ
01. 配列15分
02. スライス15分
03. appendで育てる15分
04. rangeで走査する15分
05. マップ15分
06. カンマokイディオム15分
07. つくる: 検索と集計20分
08. 第5章クイズ10分
6
構造体とメソッド
01. 構造体15分
02. 初期化とフィールド15分
03. メソッド15分
04. ポインタレシーバ20分
05. New関数の慣習15分
06. 構造体のスライス15分
07. つくる: Itemで再設計20分
08. 第6章クイズ10分
7
ゴルーチンと並行処理のさわり
01. ゴルーチン15分
02. チャネル20分
03. 待ち合わせ20分
04. 並行の落とし穴20分
05. つくる: 並行集計20分
06. 第7章クイズ10分
8
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分
9
総合制作
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 は本文を書く前に呼ぶ

入出力例

callSearch("GET", "keyword=kinoko") → "200 検索語: kinoko" callSearch("GET", "") → "200 検索語: なし" callSearch("POST", "") → "405 method not allowed" callSearch("DELETE", "keyword=x") → "405 method not allowed"

ヒント

最初に `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 で保存