1. 一覧
  2. 詳細
  3. 無い id は404
  4. id が数字でなくても404
  5. 出品は201で id が採番される
  6. 名前が空なら400
  7. 価格が0なら400
  8. 知らないパス
コース一覧
Go道場 fleamaをGoで作り直す10問
問10 総合 リプレイス完遂

Go道場 fleamaをGoで作り直す10問

Go入門で身に付けた技を、商店街公式フリマアプリ「fleama」の Goリプレイス計画で試す演習専用コースです。解説はありません。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。ゼロ値の予言から始まり、error の受け止め方、for だけのループ、switch と定数、スライスとマップ、構造体とメソッド、ゴルーチンでの並行処理、JSON を返すハンドラを経て、最後は一覧・詳細・出品の3エンドポイントを Node版と互換になるよう組み上げるところまで、10問で Go の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。Go入門を終えて「読めるけれど自分では書けない」と感じている方に向いています。

1
Goリプレイス計画
01. 問1 ゼロ値を予言せよ15分
02. 問2 errを無視するな20分
03. 問3 forしかない世界で集計せよ20分
04. 問4 商品状態で出し分けろ20分
05. 問5 スライスを育てよ25分
06. 問6 マップで在庫台帳25分
07. 問7 Itemに魂を込めよ30分
08. 問8 3本同時に走らせろ35分
09. 問9 JSONで応答せよ35分
10. 問10 総合 リプレイス完遂45分

問10 総合 リプレイス完遂

師範 / 目安 45分

凛さんが、めずらしく手を止めてこちらを見ました。

「最終ミッションです。fleama API 仕様書のうち、一覧・詳細・出品の3エンドポイント——Node版と完全互換の Go 実装を。互換テストが全部緑になったら、本番を切り替えます」

少し間があって、続けます。

「……fleama の心臓を、あなたに預けます」

ここまでの9問が、そのまま道具になります。

使うものどの問で
error を受け止める問2
switch で分ける問4
スライスを育てる問5
構造体とコンストラクタ問7
構造体タグと JSON問9

仕様書(抜粋)

メソッドとパス応答ステータス
GET /items商品一覧の配列200
GET /items/:id商品1件200
GET /items/:id(無い id){"error":"商品が見つかりません"}404
POST /items作られた商品201
POST /items(検証で落ちる){"error":"<理由>"}400

JSON のキーは id name price です。エラーの形は {"error":"..."} で統一します。

検証は問7の NewItem に任せてください。名前が空なら 商品名は必須です、価格が 0 以下なら 価格は1円以上です です。

完成条件

handleRequest を作ってください。メソッド・パス・出品する商品名・価格を受け取り、ステータス|本文 の形で返します。

プレーンテキスト

200|[{"id":1,"name":"レザースニーカー","price":4800}] 404|{"error":"商品が見つかりません"} 201|{"id":3,"name":"木製のスツール","price":3500} 400|{"error":"商品名は必須です"}

初期の在庫は id が 1 と 2 の2件です。出品したときの id は、いまある最大の id に 1 を足します。

知らないパスが来たときは 404|{"error":"見つかりません"} を返してください。

要件

  1. GET /items は一覧を 200 で、GET /items/1 は1件を 200 で返す(無い id は 404 で 商品が見つかりません)
  2. POST /items は検証を通れば 201 で作られた商品を返し、通らなければ 400 で理由を返す
  3. 知らないパスは 404|{"error":"見つかりません"} を返す

入出力例

handleRequest("GET", "/items", "", 0) → "200|[{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}]" handleRequest("GET", "/items/2", "", 0) → "200|{"id":2,"name":"古着のデニムジャケット","price":6200}" handleRequest("GET", "/items/999", "", 0) → "404|{"error":"商品が見つかりません"}" handleRequest("GET", "/items/abc", "", 0) → "404|{"error":"商品が見つかりません"}" handleRequest("POST", "/items", "木製のスツール", 3500) → "201|{"id":3,"name":"木製のスツール","price":3500}" handleRequest("POST", "/items", "", 3500) → "400|{"error":"商品名は必須です"}" handleRequest("POST", "/items", "木製のスツール", 0) → "400|{"error":"価格は1円以上です"}" handleRequest("GET", "/users", "", 0) → "404|{"error":"見つかりません"}"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

まず `NewItem` の検証を書きます。問7と同じ形です

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

関連レッスン

  • 問9 JSONで応答せよ

    構造体タグで Node版と同じフィールド名の JSON を返すハンドラを書きます。

  • 問8 3本同時に走らせろ

    3カテゴリの集計を goroutine で同時に走らせ、チャネルで回収します。

  • 問7 Itemに魂を込めよ

    構造体とメソッド、そして不正な商品を生ませないコンストラクタを書きます。

  • 問6 マップで在庫台帳

    カンマokイディオムで、存在しないカテゴリを聞かれても事故らない台帳にします。

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

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

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • テストバグを見つける工程
  • スライス範囲指定で部分列を取り出す記法
  • コンストラクタインスタンス生成時の初期化処理
  • applicationJSON 本文を送るときの Content-Type
  • メソッドクラスに属する関数
  • 配列サイズ固定の同型データの集まり
main.go
学習モード
エディタを読み込んでいます

メモ

問10 総合 リプレイス完遂

⌘S で保存