1. 3カテゴリの集計
  2. 同じ値でも取りこぼさない
  3. 0 が混ざっても数が合う
コース一覧
Go道場 fleamaをGoで作り直す10問
問8 3本同時に走らせろ

Go道場 fleamaをGoで作り直す10問

Go入門で身に付けた技を、商店街公式フリマアプリ「fleama」の Goリプレイス計画で試す演習専用コースです。解説はありません。依頼と完成条件だけを読み、白紙から自分で組み立てます。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。ゼロ値の予言から始まり、error の受け止め方、for だけのループ、switch と定数、スライスとマップ、構造体とメソッド、ゴルーチンでの並行処理、JSON を返すハンドラを経て、最後は一覧・詳細・出品の3エンドポイントを Node版と互換になるよう組み上げるところまで、10問で Go の主要な道具を一巡します。1問15分から45分、全10問で約5時間です。Go入門を終えて「読めるけれど自分では書けない」と感じている方に向いています。

1
Goリプレイス計画
01. 問1 ゼロ値を予言せよ15分
02. 問2 errを無視するな20分
03. 問3 forしかない世界で集計せよ20分
04. 問4 商品状態で出し分けろ20分
05. 問5 スライスを育てよ25分
06. 問6 マップで在庫台帳25分
07. 問7 Itemに魂を込めよ30分
08. 問8 3本同時に走らせろ35分
09. 問9 JSONで応答せよ35分
10. 問10 総合 リプレイス完遂45分

問8 3本同時に走らせろ

中段 / 目安 35分

「リプレイスの動機、見せましょう」

凛さんがグラフを出しました。「3カテゴリの集計、Node版は順番に処理して3秒。Go なら同時に走らせて1秒です。ゴルーチンで証明してください」

ゴルーチンは、関数を別の流れで走らせる仕組みです。go を付けるだけです。

Go

go collect("shoes")

これだけで発射できますが、2つ困ったことが起きます。

1つ目は、結果の受け取り方です。 発射した関数の戻り値は、そのままでは受け取れません。そこでチャネルを使います。

Go

ch := make(chan int, 3) ch <- 42 // 入れる v := <-ch // 取り出す

矢印は値が動く向きです。ch <- が入れる、<-ch が取り出すです。

2つ目は、終わるのを待つことです。 main が先に終わると、走っている途中のゴルーチンは道連れで消えます。WaitGroup で全員を待ちます。

Go

var wg sync.WaitGroup wg.Add(1) // 1人増えた go func() { defer wg.Done() // 終わったら報告 }() wg.Wait() // 全員終わるまで待つ

defer は「この関数を抜けるときに必ず実行する」という指示です。途中で return してもエラーが起きても呼ばれるので、Done の呼び忘れを防げます。

もう1つ大切なことがあります。ループの中でゴルーチンを作るとき、ループ変数をそのまま使わないでください。全員が同じ変数を見てしまい、期待どおりに動かないことがあります。引数として渡すのが確実です。

完成条件

3つのカテゴリの売上を、ゴルーチンで同時に集計する関数 collectAll を作ってください。

3つの数を受け取り、それぞれを別のゴルーチンで2倍にしてチャネルへ送り、全部の合計を返します。

WaitGroup で3つとも終わるのを待ってから、チャネルを閉じて合計してください。待たずに数えると、間に合わなかった分を取りこぼします。

要件

  1. 3つの数をそれぞれ別のゴルーチンで処理する(go を使う)
  2. 結果はチャネルで回収し、WaitGroup で全部の完了を待つ
  3. ループ変数をゴルーチンへ直接渡さず、引数として渡す

入出力例

collectAll(1200, 3400, 800) → 10800 collectAll(100, 100, 100) → 600 collectAll(0, 2500, 0) → 5000

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

ループの中で `wg.Add(1)` を呼んでから `go func(...)` で発射します

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

関連レッスン

  • 問9 JSONで応答せよ

    構造体タグで Node版と同じフィールド名の JSON を返すハンドラを書きます。

  • 問10 総合 リプレイス完遂

    一覧・詳細・出品の3エンドポイントを、Node版と互換になるよう組み上げます。

  • 問7 Itemに魂を込めよ

    構造体とメソッド、そして不正な商品を生ませないコンストラクタを書きます。

  • 問6 マップで在庫台帳

    カンマokイディオムで、存在しないカテゴリを聞かれても事故らない台帳にします。

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

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

  • グラフノード(頂点)とエッジ(辺)で構成されるデータ構造。
  • 処理計算や代入を表す長方形
  • 関数処理に名前を付けて再利用できる単位
  • 戻り値呼び出し元への返答を表す点線矢印
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 変数データに名前をつけて参照する仕組み
  • 引数位置引数=順番で渡す。
main.go
学習モード
エディタを読み込んでいます

メモ

問8 3本同時に走らせろ

⌘S で保存