ゴルーチンは、Go で並行プログラミングを実現する機能だ。Elixir のプロセスと同じようなものだと理解した。
ゴルーチンを使うには次のように関数呼び出しの前に go をつけるだけだ。これでその関数は新しいゴルーチンの中で実行され、プログラムはゴルーチンの終了を待つことなく次の処理に移る。つまりゴルーチンの処理とメインの処理が平行に動作するってわけだ。
例を見てみよう。まずは普通の(ゴルーチンを使わない)プログラム。
package main
import (
"fmt"
"time"
)
func test(n int, name string) {
for i := 1; i <= n; i++ {
fmt.Println(i, name)
time.Sleep(500 * time.Millisecond)
}
}
func main() {
test(5, "foo") test(5, "bar")
}
2度呼び出されている test 関数は、それぞれ “foo” と “bar” を5回ずつ出力する。これは当然書いてある順に処理される。
^o^ > go run go_name.go 1 foo 2 foo 3 foo 4 foo 5 foo 1 bar 2 bar 3 bar 4 bar 5 bar
じゃあ、次はゴルーチンを使ってみよう。ひとつめの関数呼び出しをゴルーチンに渡してみる。こんなプログラムになる。
package main
import (
"fmt"
"time"
)
func test(n int, name string) {
for i := 1; i <= n; i++ {
fmt.Println(i, name)
time.Sleep(500 * time.Millisecond)
}
}
func main() {
go test(5, "foo")
test(5, "bar")
}
実行してみる。
^o^ > go run go_name2.go 1 bar 1 foo 2 bar 2 foo 3 bar 3 foo 4 bar 4 foo 5 bar 5 foo
“foo” と “bar” が交互に出力され、二つの関数呼び出しが平行に動作している様子がわかる。
ちなみに、メインのプログラムが終了するとゴルーチンも終了するので、2つの関数呼び出しを両方ともゴルーチンにしてしまうと、何も出力されなくなる。