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 the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.