1. 2つのカテゴリ
  2. カテゴリが1つだけ
  3. 登場順に並ぶか
  4. 3つのカテゴリ
コース一覧
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分

つくる: 並行集計

カテゴリごとに同時に数える

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

プレーンテキスト

ゴルーチン go で走らせる チャネル 結果を受け取る WaitGroup 完了を待つ Mutex 共有する変数を守る

作るのは、カテゴリ別の売上集計です。カテゴリごとに1つのゴルーチンを立てて、同時に計算します。

プレーンテキスト

本:2000 家電:24800

3つの書き方から選ぶ

並行に集計して結果をまとめる方法は、いくつかあります。

プレーンテキスト

1. チャネルで受け取る 入れた数だけ取り出す 2. スライスの別の場所に書く 衝突しないので Mutex 不要 3. マップを Mutex で守る 共有するので保護が要る

2番がいちばん素直です。 カテゴリの一覧を先に作っておけば、それぞれの結果を別の添字に書けます。共有する変数が無いので、Mutex も要りません。

第7章で「まず分けるか渡すかを考える」と書いたのは、こういう場面のことです。

順番を保つ

マップを使うと、出力の順番が毎回変わります。第5章でやったとおりです。

この演習ではカテゴリの登場順に並べてもらいます。スライスで順番を持てば、並行に計算しても順番は崩れません。ここも2番の書き方が効く理由です。

手順

プレーンテキスト

1. カテゴリの一覧を、登場順に重複なく集める 2. 一覧の長さぶんの結果スライスを用意する 3. カテゴリごとにゴルーチンを立て、合計を該当の添字へ書く 4. WaitGroup で全部待つ 5. 一覧の順に文字列を組み立てる

1 は並行処理ではありません。先に順番を確定させてから並行に走らせる、という段取りです。ここを並行にすると順番が崩れます。

引数で渡すのを忘れない

Go

go func(idx int, cat string) { defer wg.Done() results[idx] = sumOf(cat) }(i, category)

ループの変数をそのまま参照せず、引数で渡します。第4章の defer と同じ理由で、始めた時点の値を使うためです。

要件

  1. カテゴリを登場順に重複なく集める
  2. カテゴリごとにゴルーチンを立てて合計を計算する
  3. sync.WaitGroup で全部の完了を待つ
  4. カテゴリ:合計 を半角スペース区切りで、登場順に並べる
  5. 0件のときは空文字を返す

入出力例

categoryTotals(["本","家電","本"], [1200,24800,800]) → "本:2000 家電:24800" categoryTotals(["本","本"], [1000,2000]) → "本:3000" categoryTotals(["家電","本","家電"], [500,100,500]) → "家電:1000 本:100" categoryTotals(["A","B","C"], [10,20,30]) → "A:10 B:20 C:30"

ヒント

カテゴリの一覧を集めるところは初期コードに書いてあります。集計のゴルーチンを足してください

ゴルーチンの中では、全件を回して自分のカテゴリと一致するものだけ足します

`wg.Wait()` を組み立ての前に置いてください。無いと結果が揃う前に文字列を作ってしまいます

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

関連レッスン

  • 第7章クイズ

    ゴルーチン、チャネル、WaitGroup、データ競合についての理解を確認します。

  • サーバーを立てる

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

  • 仕様互換を仕上げる

    ステータスコードとエラー形式を仕様に揃え、互換のあるAPIとして仕上げられるようになります。

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

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

  • 変数データに名前をつけて参照する仕組み
  • スライス範囲指定で部分列を取り出す記法
  • 処理計算や代入を表す長方形
  • 引数位置引数=順番で渡す。
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
main.go
学習モード
エディタを読み込んでいます

メモ

つくる: 並行集計

⌘S で保存