Chapter 01

はじめに

さき(H.Saki)
さき(H.Saki)
2021.06.18に更新

この本について

forif文が重要で必要なのはわかるけど、go文がなんで用意されているのかがよくわからない。
どうやら「並行処理」というものができるらしいけど、それができて何が嬉しいの?

……というのが、私が初めてgo文によるゴールーチン作成を知ったときの感想です。
私が競プロからプログラミングをかじり始めたということもあり、そこで出てこない並行処理という概念は完全に「お前誰や???」状態でした。

ちょっと勉強して、go文で並行にしたらどう嬉しくなるのか理解しましたが、だからといっていきなりgo文を正しく使えるようにはなりません。
sequentialな処理とは全然性質が違う、並行処理特有の落とし穴に落ちて「なんでや!」となって必死にデバッグしたり。

また、go文で複数個作られたゴールーチンが、どう順番に実行されているのか?というところが気になり始めると、途端にGとかMとかPとかいう専門用語が出てきて "What's this????" となってまた必死に調べたり。

このように、自分が思った疑問に対する答えを見つけようといろいろ勉強して、また関連した周辺知識もついでに調べて、とやっていたら出来上がっていたのがこの本です。

本の構成

2章: 並行処理と並列処理

混同しやすい2つの言葉「並行処理」と「並列処理」の定義について論じ、Goで扱うのは「並行」処理の方であることを確認します。

また、そこから、

  • 並行処理したら何が嬉しいの?
  • 並行処理って難しいの?
  • 正しく動かすためには何を気をつけるべきなの?

というマインド面について明らかにしていきます。

3章: ゴールーチンとチャネル

Goで並行処理するにあたり重要なコンポーネントになる、ゴールーチン・チャネル・sync.WaitGroupについて説明します。

4章: Goで並行処理(基本編)

3章で説明したコンポーネントを利用しつつ正しく並行処理を実装するために知っておくべき事柄 - 具体的にはチャネルの性質・やりがちな初歩的なバグ等 - について紹介します。

5章: Goで並行処理(応用編)

ゴールーチン・チャネル等を使って実現された様々な並行処理の具体例を、本やカンファレンスセッションの内容を引用することで紹介していきます。

6章: 並行処理を支えるGoランタイム

ここからはGoランタイムという、抽象的・低レイヤな話になっていきます。

ゴールーチンが複数個作られても、きちんとその全てが処理されるように実行を制御する仕組みがランタイムには備わっています。
ここでは、Goのランタイムの挙動を理解するために必要な概念・部品についての情報をまとめています。

7章: Goランタイムケーススタディ

6章で紹介した概念を使って、Goランタイムの具体的な挙動について深掘りしていきます。

8章: チャネルの内部構造

Goのランタイムの中で、チャネルがどう動いているのかについて説明しています。

9章: (おまけ)実行ファイル分析のやり方

6~8章と、ランタイムの挙動を探る過程において、時々「コンパイル後のGoプログラムの実行ファイルを解析する」という手法が出てきています。
ここでは、それをどうやってやっていたのかについて残してあります。

10章: 並行処理で役立つデバッグ&分析手法

ゴールーチンを使って並行処理を進めるにあたって、「いつ何が動いているのか?」といった情報が気になるときがあります。
このときに役立つ各種デバッグ・分析手法について紹介します。

11章: (おまけ)低レイヤの話 ~Linuxとの比較~

Goのランタイムは「ゴールーチーンを適切にスケジューリングする」という側面において、OSと似た機能を持つともいえます。
ここでは、少し本筋からは外れますが、「Linuxカーネルがプロセス・スレッド・シグナルをどう扱うのか」ということについて軽く掘り下げ、Goランタイムはそれに比較してどうか、という考察をしていきます。

使用する環境・バージョン

  • OS: macOS Catalina 10.15.7
  • go version go1.16.2 darwin/amd64

読者に要求する前提知識

  • Goの基本的な文法の読み書きができること
  • 基本情報技術者試験くらいのIT前提知識