goroutineを使ったときのメモです。
channelで待ち合わせせずgoroutineを使う場合の注意
mainのgoroutineが終了すると、他のgoroutineが走っていてもプログラムは終了してしまうので注意しよう。待ち合わせをしたい場合はchannelを使う。
main.go
package main
import (
"fmt"
"time"
)
func main() {
go func() {
fmt.Println("start goroutine")
time.Sleep(3 * time.Second)
}()
// time.Sleep(4 * time.Second)
fmt.Println("finished")
}
上記のコードを走らせた場合は以下のようになり、goroutineがそもそも開始されていないことがわかる。
$ go run main.go
finished
channelを使って待ち合わせした場合
main.go
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan bool)
go func() {
fmt.Println("start goroutine")
time.Sleep(3 * time.Second)
fmt.Println("finish goroutine")
done <- true
}()
<-done
fmt.Println("finished")
}
こちらの場合は以下のように出力される。
$ go run main.go
start goroutine
finish goroutine
finished