コース一覧
    Go基礎:データ構造
    カンマokイディオム

    Go基礎:データ構造

    Goのスライス、マップ、構造体、メソッドを使ったデータ表現を学ぶコースです。

    1
    スライスとマップ
    01. 配列15分
    02. スライス15分
    03. appendで育てる15分
    04. rangeで走査する15分
    05. マップ15分
    06. カンマokイディオム15分
    07. つくる: 検索と集計20分
    08. 第5章クイズ10分
    2
    構造体とメソッド
    01. 構造体15分
    02. 初期化とフィールド15分
    03. メソッド15分
    04. ポインタレシーバ20分
    05. New関数の慣習15分
    06. 構造体のスライス15分
    07. つくる: Itemで再設計20分
    08. 第6章クイズ10分

    カンマ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. 記録が無ければ 商品名 取り扱いなし

    ヒント

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

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

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

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

    関連レッスン

    • つくる: 検索と集計

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

    • 第5章クイズ

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

    • 構造体

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

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

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

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

    メモ

    カンマokイディオム

    ⌘S で保存