🖥
Go言語 | goroutineの基本 ( Go by Example より )
Go by Example: Goroutines に以下のサンプルがある。
package main
import "fmt"
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
f("direct")
go f("goroutine")
go func(msg string) {
fmt.Println(msg)
}("going")
var input string
fmt.Scanln(&input)
fmt.Println("done")
}
解説
普通に出力を行う部分
これは必ず実行される。
f("direct")
非同期でループ実行される部分。
go f("goroutine")
非同期で1回だけ実行される部分。
go func(msg string) {
fmt.Println(msg)
}("going")
ユーザー入力を待つ部分
これがないと、プログラムが非同期処理より早く終わってしまって、結果が出力されない。
var input string
fmt.Scanln(&input)
fmt.Println("done")
要するに非同期処理が終わるまで待てば良いので、Sleep とかでも同じことが出来るようだ。
time.Sleep(100000)
fmt.Println("done")
実行結果
goroutine : 0
goroutine : 1
goroutine : 2
going
いまいち非同期処理されていることが分かりづらい。
ループ回数を増やしてみよう
- for i := 0; i < 3; i++ {
+ for i := 0; i < 30; i++ {
結果
非同期処理されているのが分かりやすくなった。
(コマンドを走らせるたびに going
の位置が変わることに気付くだろう)
..
goroutine : 3
goroutine : 4
goroutine : 5
going
goroutine : 6
goroutine : 7
goroutine : 8
..
環境
- go version go1.8.1 darwin/amd64
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2017-04-29
Discussion