goroutine を複数起動してどれか一つがエラーになった時の終了する

{
    broadCastChan := make(chan struct{}, 1)
    stopChan := make(chan struct{}, len(workers))
    var wg sync.WaitGroup

    for _, worker := range workers {
        wg.Add(1)
        go func(worker *Worker) {
            defer wg.Done()
            err := worker.Work(broadCastChan)
            log.Println(err)
            stopChan <- struct{}{}
        }(worker)
    }

    <-stopChan
    close(broadCastChan)
    wg.Wait()
}

stopChan に <- struct{}{} する際に block しないように worker 数を capacity に指定。 stopChan で一つでも受け取ったら broadCastChan を close して worker の中で

{
    for {
        select {
        case <-broadCastChan:
            // exit
            return
        default:
            // do something
        }
    }
}

みたいな感じで待っておいて各 worker を終了。

wg.Wait で全ての worker が終わるまで待つ。

こんな感じかなぁ。