1. キーワードで1件に絞る
  2. キーワードが空なら全件
  3. 該当なし
  4. 全件で最多が家電
コース一覧
Go入門
つくる: 検索と集計

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分

つくる: 検索と集計

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

第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. カテゴリの集計にはマップを使う

入出力例

searchSummary(["きのこ図鑑","中古スマホ","古い辞書"], [1200,24800,800], ["本","家電","本"], "きのこ図鑑") → "該当1件 合計1200円 最多カテゴリは本(1件)" searchSummary(["きのこ図鑑","古い辞書"], [1200,800], ["本","本"], "") → "該当2件 合計2000円 最多カテゴリは本(2件)" searchSummary(["きのこ図鑑"], [1200], ["本"], "謎の箱") → "該当なし" searchSummary(["A","B","C"], [100,200,300], ["家電","家電","本"], "") → "該当3件 合計600円 最多カテゴリは家電(2件)"

ヒント

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

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

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

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

関連レッスン

  • 第5章クイズ

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

  • 構造体

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

  • ゴルーチン

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

  • サーバーを立てる

    net/httpでHTTPサーバーを立て、リクエストに応答を返せるようになります。

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

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

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

メモ

つくる: 検索と集計

⌘S で保存