1. 一覧
  2. キーワードで絞る
  3. 該当なしは空配列
  4. 詳細
  5. 存在しないID
  6. 数値でないID
  7. 出品成功
  8. 出品の検証NG
コース一覧
Go入門
つくる: API主要部完成

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分

つくる: API主要部完成

エンドポイント一式を1つの mux に

第8章の内容を全部使います。新しい知識はありません。

プレーンテキスト

ServeMux パスで振り分ける メソッド判定 GET と POST を分ける JSON 構造体タグで返す クエリ 検索で絞り込む パス ID を取り出す ステータス 200 / 201 / 400 / 404

ここまで1本ずつ作ってきたものを、1つのサーバーにまとめます。

プレーンテキスト

GET /items 一覧(keyword で絞り込み) GET /items/{id} 詳細(無ければ404) POST /items 出品(検証して201)

応答の形を揃える

1つの API の中で、成功もエラーも同じ形にします。

プレーンテキスト

成功 データそのもの エラー {"error":"理由"}

エラーのときだけ形が変わると、使う側が毎回確かめることになります。第8章で何度か触れた話です。

エラーを返す処理が3か所以上出てくるので、関数に切り出すと読みやすくなります。

Go

func writeError(w http.ResponseWriter, code int, message string) { w.WriteHeader(code) w.Write([]byte(fmt.Sprintf(`{"error":%q}`, message))) }

第4章でやった「同じ処理が2回以上出てきたら切り出す」の判断です。

ステータスコードの割り当て

プレーンテキスト

GET /items 200 GET /items/1 200 GET /items/99 404 存在しない GET /items/abc 400 IDの形が違う POST /items 正常 201 作った POST /items 検証NG 400 送られた内容がおかしい

404 と 400 の使い分けが要点です。「そのIDのものが無い」のか「そもそもリクエストの書き方が違う」のかで分けます。

メソッドで分ける

/items は GET と POST の両方を受けます。1つのハンドラの中で分けるか、Go 1.22 の記法で別々に登録するか、どちらでも構いません。

Go

mux.HandleFunc("GET /items", listHandler) mux.HandleFunc("POST /items", createHandler)

別々に登録するほうが、1つ1つのハンドラが短くなります。

順番に作る

プレーンテキスト

1. GET /items だけを通す 2. GET /items/{id} を足す 3. 404 と 400 を分ける 4. POST /items を足す 5. エラーの形を揃える

1段ごとにテストを流してください。全部書いてから直すと、どこで崩れたのか分からなくなります。

要件

  1. GET /items はクエリ keyword で絞り込む。0件でも [] を返す
  2. GET /items/{id} は数値でなければ 400、無ければ 404
  3. POST /items は検証を通れば 201、通らなければ 400
  4. エラーの本文は {"error":"理由"} の形に揃える

入出力例

callAPI("GET", "/items", "") → "200 [{"id":1,"name":"きのこ図鑑","price":1200},{"id":2,"name":"中古スマホ","price":24800}]" callAPI("GET", "/items?keyword=中古スマホ", "") → "200 [{"id":2,"name":"中古スマホ","price":24800}]" callAPI("GET", "/items?keyword=謎の箱", "") → "200 []" callAPI("GET", "/items/2", "") → "200 {"id":2,"name":"中古スマホ","price":24800}" callAPI("GET", "/items/99", "") → "404 {"error":"not found"}" callAPI("GET", "/items/abc", "") → "400 {"error":"invalid id"}" callAPI("POST", "/items", "{"name":"新商品","price":500}") → "201 {"id":0,"name":"新商品","price":500}" callAPI("POST", "/items", "{"name":"","price":500}") → "400 {"error":"商品名が空です"}"

ヒント

`writeError` は用意してあります。エラーを返すところは全部これを使ってください

`detailHandler` では、まず `strconv.Atoi` で 400 を判定し、見つからなければ最後に 404 を返します

出品成功のテストで `id` が 0 になっているのは、送られてこなかったフィールドがゼロ値になるためです

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

関連レッスン

  • 第8章クイズ

    net/http、ハンドラ、JSON、ルーティング、ステータスコードについての理解を確認します。

  • 仕様互換を仕上げる

    ステータスコードとエラー形式を仕様に揃え、互換のあるAPIとして仕上げられるようになります。

  • 出品API

    POSTのボディを読んで検証し、不正なら400を返して登録できるようになります。

  • 詳細APIと404

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

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

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

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • APIアプリ間でデータをやり取りする窓口
  • 処理計算や代入を表す長方形
  • 関数処理に名前を付けて再利用できる単位
  • 判断YES/NO 分岐を表す菱形
  • ステータスコード200/201/404 など結果を示す3桁の数値
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
main.go
学習モード
エディタを読み込んでいます

メモ

つくる: API主要部完成

⌘S で保存