コース一覧
    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分

    ゴルーチン

    go と書くだけ

    Go

    go doSomething()

    関数呼び出しの前に go を付けます。これだけで、その処理は別の流れで走り始めます。呼んだ側は結果を待たずに次の行へ進みます。

    この別の流れを ゴルーチン と呼びます。Go という名前がそのまま入っているとおり、この言語の看板機能です。

    何がうれしいのか

    待ち時間のある処理が並ぶと、順番に実行するのは無駄です。

    プレーンテキスト

    順番に      商品を数える(1秒) → 売上を数える(1秒) → 合計2秒
    同時に      両方を同時に始める              → 合計1秒

    サーバーは、この「待っている時間」の塊です。データベースの応答待ち、外部APIの応答待ち。その間に別のリクエストを処理できれば、同じ機械でずっと多くを捌けます。Go がサーバー向きと言われるのは、これが1語で書けるからです。

    いきなり困ること

    Go

    func main() {
    	go fmt.Println("ゴルーチンから")
    	fmt.Println("main から")
    }

    プレーンテキスト

    main から

    ゴルーチンの出力が出ません。

    main が終わると、プログラム全体が終わります。走り始めたゴルーチンは、途中でも打ち切られます。誰も待ってくれません。

    順番が決まらない

    Go

    for i := 1; i <= 3; i++ {
    	go fmt.Println(i)
    }
    time.Sleep(100 * time.Millisecond) // 終わるまで少し待つ

    出力の順番は毎回変わります。1 2 3 のこともあれば、3 1 2 のこともあります。

    最後の1行が無いと、何も出力されません。さきほどの話と同じで、main が 終わった時点で3つとも打ち切られるからです。ここでは順番を見せたいので time.Sleep で待っていますが、これは説明のための仮のやり方です。 本当の待ち合わせは次のレッスン以降で扱います。

    どちらが先に終わるかは決まっていません。 これは不具合ではなく、並行処理の性質そのものです。順番が要るなら、それを保証する仕組みを別に用意します。

    だから、この章の残りがある

    ゴルーチンは始めるのが1語で済む代わりに、終わりを扱う道具が要ります。

    プレーンテキスト

    チャネル      結果を受け取る          次のレッスン
    WaitGroup     全部の完了を待つ        その次
    Mutex         同じ変数を守る          その次の次

    go と書くのは簡単で、正しく待つのが難しい。第7章はその難しさのほうを扱います。

    このコースの演習では

    採点は関数の戻り値で行うので、結果を必ず回収してから返す形になります。次のレッスン以降で、その書き方を身につけます。今回は「待たないと結果が消える」ことを、コードで確かめてもらいます。

    要件

    1. 各要素を2倍にする処理をゴルーチンで走らせる
    2. 結果をチャネルで受け取る
    3. 要素数と同じ回数だけ取り出して合計する
    4. 要素が0件のときは 0 を返す

    ヒント

    初期コードは走らせるところまでできています。取り出す処理が抜けています

    `for i := 0; i < len(nums); i++ { total += <-ch }` で、入れた数だけ取り出します

    取り出す回数が足りないと合計が合わず、多すぎると永久に待ってタイムアウトします

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

    関連レッスン

    • チャネル

      チャネルで結果を安全に受け取り、並行処理の答えを回収できるようになります。

    • 待ち合わせ

      sync.WaitGroupで全ての処理の完了を待てるようになります。

    • 並行の落とし穴

      同じ変数を複数のゴルーチンが触ると壊れることを知り、Mutexで守れるようになります。

    • つくる: 並行集計

      第7章の知識でカテゴリ別の集計を並行に実行し、結果を安全にまとめられるようになります。

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

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

    • 関数処理に名前を付けて再利用できる単位
    • 処理計算や代入を表す長方形
    • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
    • データベースデータを構造化して保存する仕組み
    • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
    • APIアプリ間でデータをやり取りする窓口
    • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
    • 戻り値呼び出し元への返答を表す点線矢印
    main.go
    エディタを読み込んでいます

    メモ

    ゴルーチン

    ⌘S で保存