以下のコードではすべてが出力されたあとにdeadlock
のエラーが出ます。
package main import ( "sync" "github.com/k0kubun/pp" ) func main() { wg := sync.WaitGroup{} sig := make(chan bool) for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { pp.Println(i) if i == 3 { sig <- true } else { sig <- false } wg.Done() }(i) } switch { case result <-sig: if result == true{ pp.Print("True") } else { pp.Print("False") } default: } wg.Wait() close(sig) pp.Print("All Done") }
出力は以下の通りです。
9 1 5 0 2 3 "False"8 6 4 7 fatal error: all goroutines are asleep - deadlock!
しかし、以下のケースではうまくいきます。
package main import ( "sync" "github.com/k0kubun/pp" ) func main() { wg := sync.WaitGroup{} sig := make(chan bool) for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { pp.Println(i) wg.Done() }(i) } wg.Wait() pp.Print("All Done") }
- どのような違いがあって
- なぜそうなるのか
をご指導していただきたいです。
よろしくお願いたします
追加
以下のコードではすべてが出力されたあとにdeadlock
のエラーが出ます。
package main import ( "sync" "github.com/k0kubun/pp" ) func main() { wg := sync.WaitGroup{} sig := make(chan bool) for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { pp.Println(i) if i == 3 { sig <- true } else { sig <- false } wg.Done() }(i) } for { switch { case <-sig: pp.Print("True") default: pp.Print("False") } } wg.Wait() close(sig) pp.Print("All Done") }