コース一覧
    Go実践:並行処理とWeb API
    つくる: 並行集計

    Go実践:並行処理とWeb API

    Goの並行処理とWeb API開発を組み合わせ、実践的なサービス構築へ進むコースです。

    1
    ゴルーチンと並行処理のさわり
    01. ゴルーチン15分
    02. チャネル20分
    03. 待ち合わせ20分
    04. 並行の落とし穴20分
    05. つくる: 並行集計20分
    06. 第7章クイズ10分
    2
    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分
    3
    総合制作
    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件のときは空文字を返す

    ヒント

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

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

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

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

    関連レッスン

    • 第7章クイズ

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

    • サーバーを立てる

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

    • 仕様互換を仕上げる

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

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

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

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

    メモ

    つくる: 並行集計

    ⌘S で保存