問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件です。
| 状況 | 返す文言 |
|---|---|
| カテゴリが台帳に無い | そのカテゴリはありません |
| 台帳にあって在庫が 0 | shoes は在庫切れです |
| 台帳にあって在庫がある | shoes の在庫は12点です |
在庫が 0 のカテゴリと、台帳に無いカテゴリを取り違えないでください。
要件
- 台帳は
map[string]intでshoes:12tops:5furniture:0の3件を用意する - カンマokイディオム
v, ok := stock[key]でキーの存在を確かめる - 無ければ
そのカテゴリはありません、0 なら<カテゴリ> は在庫切れです、それ以外は<カテゴリ> の在庫は<数>点ですを返す
入出力例
checkStock("shoes") → "shoes の在庫は12点です"
checkStock("tops") → "tops の在庫は5点です"
checkStock("furniture") → "furniture は在庫切れです"
checkStock("hats") → "そのカテゴリはありません"
checkStock("shoe") → "そのカテゴリはありません"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部