helloという言葉とworldという言葉をprint関数を作成して、同時に表示してみる。

package main

import (
	"fmt"
	"time"
)

func main() {
	print("hello")
	print("world")

}

func print(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

これを実行すると、


hello
hello
hello
hello
hello
world
world
world
world
world

helloが5回先に表示されて、そのあとにworldが5回表示される。

time.Sleep(100 * time.Millisecond)は、0.1秒待つという意味があり、この場合0.1秒待ってfmt.Println(s)で表示してみる。

では、上記のprint("hello")をgo print("hello")に下記のように変えてみると、


package main

import (
	"fmt"
	"time"
)

func main() {
	go print("hello")
	print("world")

}

func print(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

今実行しているCPUのコア(スレッド)とは違う別のコア(スレッド)に処理を渡して並行で実行され、


world
hello
hello
world
hello
world
world
hello
hello
world

helloとworldが関数の処理が終わった順に表示される。これを、並行処理(ゴルーチン)と呼ぶ。

並行処理を行うと、ネットで同時アクセスをさばくことができたり、ファイルのアップロードが同時にできる。結果が順番を問題としない場合に使用できる。