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が関数の処理が終わった順に表示される。これを、並行処理(ゴルーチン)と呼ぶ。
並行処理を行うと、ネットで同時アクセスをさばくことができたり、ファイルのアップロードが同時にできる。結果が順番を問題としない場合に使用できる。