goroutineでハマったこと
最近、goroutine関連ではミスったことを記載します。
channelの容量(capacity)
1. 容量0(cap:0)のchannelを送信するとブロックする
2. 容量を1に指定すると問題なく動作する
3. 容量0(cap:0)のchannelでもgoroutineから呼び出すと問題ない
1のような使い方は一見すると普通はしないだろうと思うかもしれませんが、こちらのような例では使用した
goroutine の引数
またまたこちらのソースからだが、 goroutine内の低数taskがないと不具合が発生する
for _, task := range tasks { go func(t *Task) { defer wg.Done() t.Run() for { select { case <-t.doneCh: fmt.Printf("id:%d is done\n", t.id) return case err := <-t.errCh: log.Fatal(err) return } } }(task) }