待ち合わせ処理
package main
import "fmt"
func main() {
go func() {
fmt.Println("Hello world!")
}()
}
- 何も出ない…
- goroutine が実行される前に
main
が終わっちゃうため
- goroutine が終わるまで何らかの方法で待つ必要がある
修正案 (1): 信頼と実績の Sleep
package main
import (
"fmt"
"time"
)
func main() {
go func() {
fmt.Println("Hello world!")
}()
time.Sleep(time.Second)
}
- 1 秒は待ちすぎ?
- goroutine が終わったことを検知したい
修正案 (2): channel を使う
- 先述の
channel
を使っていくパターン (playground)
channel
の読み出し側が書き込みがあるまでブロッキングする性質を利用
package main
import (
"fmt"
)
func main() {
c := make(chan struct{})
go func() {
fmt.Println("Hello world!")
c <- struct{}{}
}()
<-c
}
修正案 (3): sync.WaitGroup
を使う
sync.WaitGroup
は待ち合わせをするための仕組み
- 複数の goroutine を待ち合わせたいときなんかはこれ
package main
import (
"fmt"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
fmt.Println("Hello world!")
wg.Done()
}()
wg.Wait()
}