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

    ch := make(chan int)   // int を流すチャネル
    ch <- 42               // 入れる
    v := <-ch              // 取り出す

    矢印が向きを表します。ch <- はチャネルへ入れる、<-ch はチャネルから取り出す、です。矢印はいつも値の流れる向きを指しています。

    待ち合わせの道具でもある

    チャネルの本当の役目は、値を運ぶことだけではありません。タイミングを合わせることです。

    Go

    v := <-ch

    この行は、値が入るまでそこで止まります。入った瞬間に動き出します。

    前のレッスンで「待たないと結果が消える」問題がありました。チャネルから取り出す行を書けば、そこで待つので消えません。

    容量のあるチャネル

    Go

    ch := make(chan int)      // 容量0
    ch := make(chan int, 3)   // 容量3

    容量0のチャネルは、入れる側も取り出す側が来るまで待ちます。手渡しに近い動きです。

    Go

    ch := make(chan int)
    ch <- 42   // 取り出す人がいないと、ここで永久に止まる

    1人で書いていると、これで固まります。

    プレーンテキスト

    fatal error: all goroutines are asleep - deadlock!

    デッドロックです。全員が誰かを待っていて、誰も進めない状態を Go が検出して教えてくれます。

    容量があれば、その数までは待たずに入れられます。

    Go

    ch := make(chan int, 3)
    ch <- 1   // 待たない
    ch <- 2   // 待たない

    前のレッスンで make(chan int, len(nums)) としたのは、これが理由です。全部入れきってから取り出せるので、順番を気にせずに済みます。

    取り出す回数を合わせる

    最も間違えやすいのがここです。

    プレーンテキスト

    入れた数 > 取り出す数   結果が足りない
    入れた数 < 取り出す数   永久に待つ。タイムアウト

    入れた数をきっちり数えて、同じ回数だけ取り出します。この「数を合わせる」作業が面倒なので、次のレッスンの WaitGroup が用意されています。

    range で受け取る

    Go

    for v := range ch {
    	total += v
    }

    チャネルが閉じられるまで受け取り続けます。閉じるのは送る側です。

    Go

    close(ch)

    閉じ忘れると、range は永久に待ちます。入門のうちは回数を数えて取り出す形で十分なので、close は「そういうものがある」と知っておく程度で構いません。

    要件

    1. 前半と後半をそれぞれゴルーチンで集計する
    2. 結果をチャネルで受け取る
    3. 2つの結果を足して返す
    4. 0件のときは 0 を返す

    ヒント

    初期コードには前半のゴルーチンだけがあります。後半のゴルーチンを足してください

    後半は `prices[mid:]` です。切り出しの終わりを省くと最後までになります

    取り出しは `<-ch + <-ch` と書けます。2つ入れたので2回取り出します

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

    関連レッスン

    • 待ち合わせ

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

    • 並行の落とし穴

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

    • つくる: 並行集計

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

    • 第7章クイズ

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

    main.go
    エディタを読み込んでいます

    メモ

    チャネル

    ⌘S で保存