コース一覧
    Go基礎:データ構造
    つくる: 検索と集計

    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分

    つくる: 検索と集計

    スライスとマップを組み合わせる

    第5章の内容を全部使います。

    プレーンテキスト

    スライス   一覧を持つ
    append     条件に合うものを集める
    range      走査する
    マップ     カテゴリごとに数える
    カンマok   キーの有無を見分ける

    作るのは、キーワードで絞り込んでから集計する処理です。

    プレーンテキスト

    該当2件 合計2000円 最多カテゴリは本(2件)

    2つの役割を1つの for で

    絞り込みと集計を、別々の for で書くこともできます。

    Go

    // 絞り込む
    for i, name := range names { ... }
    // 集計する
    for _, price := range matched { ... }

    1回で済ませることもできます。

    Go

    for i, name := range names {
    	if 該当しない { continue }
    	total += prices[i]
    	counts[categories[i]]++
    }

    どちらでも構いません。 分けたほうが1つ1つは読みやすく、まとめたほうが回る回数は減ります。この規模ならどちらでも差は出ないので、読みやすいと感じるほうを選んでください。

    キーワードの一致

    完全一致で判定します。商品名がキーワードと同じかどうかだけを見ます。

    部分一致にすると strings.Contains が要りますが、この章では扱っていません。実務では部分一致のほうが多いので、第8章の検索APIで改めて出てきます。

    キーワードが空文字のときは、すべてを対象にしてください。絞り込み無しの一覧、という意味になります。

    最多カテゴリの求め方

    マップを range で回して、いちばん大きいものを探します。

    Go

    maxCategory := ""
    maxCount := 0
    for category, count := range counts {
    	if count > maxCount {
    		maxCategory = category
    		maxCount = count
    	}
    }

    ここで注意があります。マップを回す順番は毎回変わります。 同じ件数のカテゴリが2つあると、どちらが選ばれるか決まりません。

    テストではその状況を作らないようにしてありますが、実際のコードでは同数のときの決め方を自分で決める必要があります。順番に頼れないというマップの性質が、こういう形で表に出てきます。

    順番に作る

    プレーンテキスト

    1. 全件を集計する(絞り込み無し)
    2. キーワードで絞る
    3. カテゴリを数える
    4. 最多を探す
    5. 該当0件のときを分ける

    要件

    1. 商品名がキーワードと完全一致するものを集める
    2. キーワードが空文字のときはすべてを対象にする
    3. 該当N件 合計M円 最多カテゴリはC(K件) の形を返す
    4. 該当が0件なら 該当なし を返す
    5. カテゴリの集計にはマップを使う

    ヒント

    絞り込みの条件は `if keyword != "" && name != keyword { continue }` です。空文字のときは弾かれません

    カテゴリの集計は `counts[categories[i]]++` の1行で済みます

    最多を探すのはマップを `range` で回します。同じ件数のカテゴリが複数あると結果が定まらないので、テストではその状況を避けています

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

    関連レッスン

    • 第5章クイズ

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

    • 構造体

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

    • カンマokイディオム

      キーの有無を2つ目の戻り値で判定し、無いキーを安全に扱えるようになります。

    • マップ

      キーと値の組で持つマップを使い、カテゴリごとの件数を集計できるようになります。

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

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

    • スライス範囲指定で部分列を取り出す記法
    • 処理計算や代入を表す長方形
    • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
    • APIアプリ間でデータをやり取りする窓口
    • テストバグを見つける工程
    main.go
    エディタを読み込んでいます

    メモ

    つくる: 検索と集計

    ⌘S で保存