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)    
    }