3章Goにおける並行処理の構成要素

本章では、Go言語に備わっている並行処理をサポートする充実した機能について紹介していきます。本章を終える頃には、構文や関数、パッケージとその機能に関する理解が深まっていることでしょう。

3.1 ゴルーチン(goroutine)

ゴルーチンはGoのプログラムでの最も基本的な構成単位です。したがって、それが何で、どのように動作するのかを理解することは重要です。事実、すべてのGoのプログラムには最低1つのゴルーチンがあります†1。それがメインゴルーチンです。これはプロセスが開始する際に自動的に生成され起動されます。ほぼすべてのプログラムで問題解決のために遅かれ早かれゴルーチンを使うことになるでしょう。ではゴルーチンとは一体何なのでしょうか。

[†1] 訳注:一般的にはガベージコレクションやソフトウェア割り込みの待ちのためゴルーチンが自動的に立ち上がりますが、その数や種類は状況によって異なります。

単純に言えば、ゴルーチンは他のコードに対し並行に実行している関数のことです(注意:必ずしも並列ではありません!)。ゴルーチンはgoキーワードを関数呼び出しの前に置くことで簡単に起動できます。

func main() {
    go sayHello()
    // 他の処理を続ける
}

func sayHello() {
    fmt.Println("hello")
}

無名関数でも動作します!次の例は先の例とまったく同じ処理を行っています。しかしながら、関数からゴルーチンを生成するかわりに、無名関数からゴルーチンを生成しています。

go func() {
    fmt.Println("hello")
}() // ❶
// 他の処理を続ける
  1. goキーワードを使うには無名関数を即値で呼び出さなければいけません。 ...

Get Go言語による並行処理 now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.