1. 在庫がある商品
  2. 記録はあるが在庫0
  3. 記録が無い商品
  4. 在庫1の商品
コース一覧
Go入門
カンマokイディオム

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分

カンマokイディオム

0 なのか、無いのか

前のレッスンで、無いキーを読むとゼロ値が返ると書きました。便利ですが、区別が付きません。

Go

counts := map[string]int{"本": 0} counts["本"] // 0 counts["食品"] // 0

本は0件と記録されている。食品はそもそも記録が無い。 どちらも 0 が返るので、この2つを見分けられません。

第4章で「0円の商品」と「見つからない」を区別した話と同じ問題です。

2つ目の戻り値で分かる

マップの読み出しは、2つ受け取れます。

Go

v, ok := counts["食品"] // v は 0、ok は false

2つ目の ok が「キーがあったか」を表します。この書き方を カンマok と呼びます。Go でよく見る言い回しです。

Go

v, ok := counts["本"] if !ok { return "記録がありません" }

受け取る数を変えるだけで、返るものが変わります。他ではあまり見ない仕組みですが、マップとチャネル(第7章)と型の変換で共通して使われます。

if の初期化文と組み合わせる

第3章と第4章で出てきた形が、ここでも効きます。

Go

if v, ok := counts["本"]; ok { return fmt.Sprintf("%d件", v) } return "記録がありません"

v と ok がこの if の中だけの変数になります。キーがあったときだけ値を使うという意図が、そのまま形になります。

これが Go で最もよく書かれる形の1つです。

いつ使い分けるか

プレーンテキスト

件数を数える counts[key]++ カンマok は要らない 設定値を読む v, ok := m[key] 未設定と 0 を区別したい 存在チェックだけ _, ok := m[key] 値は要らない

集計のように「無ければ 0 でよい」場面では、カンマok を使わないほうが短く書けます。区別が要るときだけ使う、という判断になります。

値が要らず存在だけ知りたいときは、_ で捨てます。

Go

if _, ok := counts["本"]; ok { return "記録があります" }

要件

  1. カンマok でキーの有無を判定する
  2. 記録があって在庫が1以上なら 商品名 在庫N点
  3. 記録があって在庫が0なら 商品名 在庫切れ
  4. 記録が無ければ 商品名 取り扱いなし

入出力例

stockReport("きのこ図鑑") → "きのこ図鑑 在庫3点" stockReport("中古スマホ") → "中古スマホ 在庫切れ" stockReport("謎の箱") → "謎の箱 取り扱いなし" stockReport("古い辞書") → "古い辞書 在庫1点"

ヒント

`n, ok := stocks[name]` で値と有無を同時に受け取ります

判定の順番が大事です。まず `!ok` で取り扱いなしを弾き、その後に在庫0を見ます

順番を逆にすると、記録の無い商品が `在庫切れ` になってしまいます。値が 0 なのは両方同じだからです

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

関連レッスン

  • つくる: 検索と集計

    第5章の知識でキーワード検索とカテゴリ集計を同時に行えるようになります。

  • 第5章クイズ

    配列とスライスの違い、append、range、マップ、カンマokについての理解を確認します。

  • 構造体

    関連するデータを1つの型にまとめ、Item構造体を定義できるようになります。

  • ゴルーチン

    goキーワードで処理を並行に走らせ、順番が決まらない理由を説明できるようになります。

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

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

  • 戻り値呼び出し元への返答を表す点線矢印
  • 変数データに名前をつけて参照する仕組み
  • 判断YES/NO 分岐を表す菱形
main.go
学習モード
エディタを読み込んでいます

メモ

カンマokイディオム

⌘S で保存