TL;DR

Go のランタイムが提供する軽量なスレッド。

仕組み

ゴルーチンは Go のランタイムが管理するユーザレベルスレッドであり、少数のカーネルレベルスレッドの上で動作する。

Effective Go によると、ゴルーチンは同じアドレス空間で、ほかのゴルーチンと並行に実行される関数である。スタック領域を確保する程度のコストしかかからず、スタックは小さく始まって、必要に応じてヒープを確保・解放して伸び縮みする。ゴルーチンは複数の OS スレッドに割り当てられるので、1 つが I/O 待ちなどでブロックしても、ほかのゴルーチンは動き続ける。スレッドを作ったり管理したりする複雑さは、この仕組みが隠してくれる。スレッドやコルーチン、プロセスといった既存の言葉では正確な意味が伝わらないので、ゴルーチンという名前が付けられた。

例

関数やメソッドの呼び出しの前に go キーワードを付けると、その呼び出しが新しいゴルーチンで実行される。シェルで & を付けてコマンドをバックグラウンドで動かすのに近い。

go list.Sort() // list.Sort を並行に実行し、終わるのを待たない

注意点

呼び出しが終わると、ゴルーチンは何も知らせずに終了する。終わったことを呼び出し側に伝えるには、チャネルを使う。

関連

出典