Go並行処理の本5選|goroutine・channelの実践知識を学ぶ

PR:この記事にはアフィリエイトリンクが含まれます。

Goではgo f()で関数をgoroutineとして起動できます。実務で悩むのは、結果の受け取り方やキャンセル後の終了処理。並行処理の基本と、関連する本の扱う範囲を押さえていきます。

本対象・内容参考価格(税込)
Go言語による並行処理Go言語による並行処理goroutine、channel、キャンセルやリーク対策を深く学びたい人3,080円
Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティスGo言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス並行処理の基本原則から学びたい経験者3,850円
初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイド初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイドGoの基礎と並行処理をまとめて学びたい人4,950円
実用 Go言語 第2版 ―システム開発の現場で知っておきたいアドバイス実用 Go言語 第2版 ―システム開発の現場で知っておきたいアドバイス業務で使う並行処理のパターンを知りたい人4,620円
エキスパートたちのGo言語 一流のコードから応用力を学ぶエキスパートたちのGo言語 一流のコードから応用力を学ぶ中級以上で実務やOSSのコードを読みたい人3,278円

表の価格は各書籍の希望小売価格・定価です。実売価格は時期や販売店によって変わるため、購入時は書店の表示をご確認ください。

並行処理とは

並行処理は複数の仕事を進行中にする設計です。並列処理では、複数の仕事を実際に同時実行します。似た言葉ですが、Goの動きを追うときは区別しておくと分かりやすくなります。goroutineを使えば、関数を別の実行単位として動かせます。

たとえば、複数のURLへのリクエストやファイル処理を順番に行うと、待ち時間が積み重なります。互いに独立した処理を並行させれば、その待ち時間を重ねて進められるところがあります。

とはいえ、goroutineを増やせば必ず速くなるわけではありません。CPUやネットワーク、共有データへのアクセスが詰まっていると、数を増やしたぶん競合や管理の手間が膨らむこともあります。

goroutineの基本

go f()を実行すると、関数は別のgoroutineで動き始めます。呼び出し元は完了を待たずに先へ進みますが、戻り値はそのまま受け取れません。完了や結果を知らせる方法も、あわせて考えておきましょう。

複数の処理が終わるまで待つときは、sync.WaitGroupが基本です。goroutineを起動する前にAddし、処理の最後でDoneを呼びます。呼び出し側のWaitで完了を待つ、この流れですね。

入力の数だけgoroutineを起動すると、リクエストが集中したときに資源を使い切るおそれがあります。一定数のworkerに仕事を振れば、同時に動く処理を制限できます。数を管理しやすいのも利点です。

channelの役割

channelはgoroutineどうしで値を受け渡す仕組みです。ch <- valueで送り、value := <-chで受け取ります。値の流れがコードに表れるので、処理の境界を追いやすいですね。

バッファなしchannelでは、受信側が値を受け取るまで送信側が待ちます。容量を持たせると、空きがある間は送信を受け付けます。小さな待ち行列として考えると分かりやすいでしょう。

複数のchannel操作やctx.Done()を待つときは、selectが便利です。仕事を受け取りながらキャンセルも確認するworkerでは、処理を続けるか終えるかを決める要所になります。

channelを閉じるのは原則として送信側です。受信側が閉じると、その後の送信でpanicが起こります。送信側が複数ある場合は、すべての送信が終わったと確認してから閉じましょう。

停止と競合対策

goroutineは、呼び出し元の関数が終わっても自動では止まりません。受け手のいないchannelへの送信や、誰も受け取らない結果を待ち続ける処理はリークにつながります。起動時に終了条件も決めておく必要があります。

context.Contextを引数で渡せば、呼び出し側からキャンセルやタイムアウトを知らせられます。各goroutineがctx.Done()を確認して、channel待ちや長い処理から抜けられるようにします。

複数のgoroutineが同じ変数を読み書きすると、競合状態が起こることがあります。go test -raceは検出の助けになりますが、設計上の問題をすべて見つけるものではありません。

channelとmutexでは、得意な場面が異なります。値や仕事を受け渡すならchannel、共有状態を複数の処理から守るならmutexが合う場合もあります。どちらかに統一する必要はありません。

Go全体から学ぶ

『初めてのGo言語 第2版』は2025年刊、552頁のGo入門書です。goroutine、channel、selectから、バッファリングやクローズまで解説しています。並行処理の基礎をGo全体の学習につなげられる一冊です。

contextによる終了やタイムアウト、WaitGroup、バックプレッシャーも範囲に含まれます。章末問題で手を動かせる構成です。mutexやアトミック操作を使う場面も取り上げています。

Goの基礎と並行処理を一冊で学ぶなら、この本を最初に買うのが堅実です。他言語の経験をGoらしい実装につなげたい人にもおすすめします。

初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイド

初めてのGo言語 第2版 ―他言語プログラマーのためのイディオマティックGo実践ガイド

オライリー・ジャパン

Amazonで見る

設計を掘り下げる

『Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス』は2024年刊、336頁です。プログラミング経験者向けで、GoまたはC言語系の基礎がある人を理想的な読者としています。

共有メモリとメッセージパッシングを軸に、goroutine、channel、selectを学べます。条件変数、セマフォ、アトミック、デッドロック回避も取り上げ、他言語にも通じる設計原則を解説します。

Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス

Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス

インプレス

Amazonで見る

『Go言語による並行処理』は2018年刊、256頁です。goroutine、channel、selectのほか、WaitGroup、Mutex、RWMutexなど、Goの並行処理を掘り下げています。

パイプラインやファンアウト・ファンイン、goroutineリーク対策、contextによるキャンセルも扱います。競合状態の検出やpprof、traceまで学べるので、Goの基礎を知ったうえで並行処理を深く学びたい人におすすめです。

Go言語による並行処理

Go言語による並行処理

オライリー・ジャパン

Amazonで見る

現場の型を学ぶ

『実用 Go言語 第2版』は2025年刊、496頁。業務でGoを使う人に向け、goroutineやchannelの基本から、ゴルーチンプール、処理速度制限、ファンアウト・ファンインまで紹介します。

contextを使ったエラー通知に加え、ループやchannel待ちによるリーク、そのテストでの検知も解説しています。並行処理を現場の開発に取り入れる人におすすめです。

実用 Go言語 第2版 ―システム開発の現場で知っておきたいアドバイス

実用 Go言語 第2版 ―システム開発の現場で知っておきたいアドバイス

オライリー・ジャパン

Amazonで見る

『エキスパートたちのGo言語 一流のコードから応用力を学ぶ』は2022年刊、400頁です。中級以上のGoプログラマーに向け、OSSのコードや開発手法を紹介しています。

goroutine、channelパターン、contextの応用に加えて、並行性の問題検出も範囲に含まれます。実際のコードから応用力を身につけたい人に合うでしょう。

エキスパートたちのGo言語 一流のコードから応用力を学ぶ

エキスパートたちのGo言語 一流のコードから応用力を学ぶ

技術評論社

Amazonで見る

まとめ

goroutineは仕事を並行して動かす実行単位で、channelは値や仕事の受け渡しに使います。実践では完了を待つ方法、同時実行数、終了の合図もそろえて考えると、処理を追いやすくなります。

Go全体を学び始める人には『初めてのGo言語 第2版』、並行処理を集中して学ぶ人には『Go言語による並行処理』がおすすめです。他言語にも通じる設計原則を学びたい経験者には、Cutajarの本をすすめます。

実務パターンを探す人には『実用 Go言語 第2版』、OSSコードから応用力を高めたい人には『エキスパートたちのGo言語』をおすすめします。

【2026年版】Amazonで買えるおすすめノートPCランキング!コスパ最強のモデルはこれだ
DELLのノートパソコンがテーブルの上に置いてある画像

Amazon の PC をスコア化してみた

Specsy Hub

Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。

タイトルとURLをコピーしました