1. 在庫がある
  2. 別のカテゴリ
  3. 台帳にあって在庫が0
  4. 台帳に無いカテゴリ。0 と混同すると落ちる
  5. 綴り違いも台帳に無い扱い
コース一覧
Go道場 fleamaをGoで作り直す10問
問6 マップで在庫台帳

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分

問6 マップで在庫台帳

中段 / 目安 25分

「カテゴリ別の在庫台帳を作ってください」

凛さんは、少し前の障害報告書を出してきました。「存在しないカテゴリを聞かれたとき、Node版は undefined で事故りました。Go には『あるかどうか』を同時に教わる書き方がありますね」

マップはキーと値の対応表です。

Go

stock := map[string]int{ "shoes": 12, "tops": 5, }

問題は、無いキーを引いたときです。

Go

n := stock["hats"] // 0 が返る

エラーにはなりません。ゼロ値が返ります。 ここで困るのは、「在庫が 0 件」と「そのカテゴリ自体が無い」を区別できないことです。前者は仕入れれば増えますが、後者はカテゴリの綴り間違いかもしれません。

Go は、この2つを見分ける書き方を用意しています。

Go

n, ok := stock["hats"]

2つ目の戻り値が、キーが存在したかどうかです。カンマの後ろに ok を置くので、カンマokイディオムと呼ばれます。前回の err と同じで、返ってきた ok を見るまで値を信じないという形です。

Go

if !ok { return "そのカテゴリはありません" }

undefined の悪夢とは、ここでお別れです。

完成条件

カテゴリ名を受け取り、在庫の状況を返す関数 checkStock を作ってください。台帳は関数の中で組み立てます。shoes が 12、tops が 5、furniture が 0 の3件です。

状況返す文言
カテゴリが台帳に無いそのカテゴリはありません
台帳にあって在庫が 0shoes は在庫切れです
台帳にあって在庫があるshoes の在庫は12点です

在庫が 0 のカテゴリと、台帳に無いカテゴリを取り違えないでください。

要件

  1. 台帳は map[string]int で shoes:12 tops:5 furniture:0 の3件を用意する
  2. カンマokイディオム v, ok := stock[key] でキーの存在を確かめる
  3. 無ければ そのカテゴリはありません、0 なら <カテゴリ> は在庫切れです、それ以外は <カテゴリ> の在庫は<数>点です を返す

入出力例

checkStock("shoes") → "shoes の在庫は12点です" checkStock("tops") → "tops の在庫は5点です" checkStock("furniture") → "furniture は在庫切れです" checkStock("hats") → "そのカテゴリはありません" checkStock("shoe") → "そのカテゴリはありません"

ヒント

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

初期コードは値だけを受け取っているので、無いキーでも 0 が返って区別できません

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

関連レッスン

  • 問7 Itemに魂を込めよ

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

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

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

  • 問9 JSONで応答せよ

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

  • 問10 総合 リプレイス完遂

    一覧・詳細・出品の3エンドポイントを、Node版と互換になるよう組み上げます。

main.go
学習モード
エディタを読み込んでいます

メモ

問6 マップで在庫台帳

⌘S で保存