TL;DR
仕組み
ゴルーチンは Go のランタイムが管理するユーザレベルスレッドであり、少数のカーネルレベルスレッドの上で動作する。
Effective Go によると、ゴルーチンは同じアドレス空間で、ほかのゴルーチンと並行に実行される関数である。スタック領域を確保する程度のコストしかかからず、スタックは小さく始まって、必要に応じてヒープを確保・解放して伸び縮みする。ゴルーチンは複数の OS スレッドに割り当てられるので、1 つが I/O 待ちなどでブロックしても、ほかのゴルーチンは動き続ける。スレッドを作ったり管理したりする複雑さは、この仕組みが隠してくれる。スレッドやコルーチン、プロセスといった既存の言葉では正確な意味が伝わらないので、ゴルーチンという名前が付けられた。
例
関数やメソッドの呼び出しの前に go キーワードを付けると、その呼び出しが新しいゴルーチンで実行される。シェルで & を付けてコマンドをバックグラウンドで動かすのに近い。
go list.Sort() // list.Sort を並行に実行し、終わるのを待たない注意点
呼び出しが終わると、ゴルーチンは何も知らせずに終了する。終わったことを呼び出し側に伝えるには、チャネルを使う。