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 が終わるまで待つ。

こんな感じかなぁ。

青い花 1-8

青い花(1)

青い花(1)

青い花(2)

青い花(2)

青い花(3)

青い花(3)

青い花(4)

青い花(4)

青い花(5)

青い花(5)

青い花(6)

青い花(6)

青い花(7)

青い花(7)

青い花(8)

青い花(8)

クリムゾンの迷宮

(恐らく)中学生の頃に読んだ青の炎より前の作品を今頃読むのもなんだか面白いなぁと思った。

砂糖菓子の弾丸は撃ちぬけない

砂糖菓子の弾丸は撃ちぬけない (角川文庫)

砂糖菓子の弾丸は撃ちぬけない (角川文庫)

あたしは、暴力も喪失も痛みもなにもなかったふりをしてつらっとしてある日大人になるだろう。友達の死を若き日の勲章みたいに居酒屋で飲みながら憐情たっぷりに語るような腐った大人にはなりたくない。胸の中でどうにも整理できない事件をどうにもできないまま大人になる気がする。だけど十三歳でここにいて周りには同じようなへっぽこ武器でぽこぽこへんなものを撃ちながら戦ってる兵士たちがほかにもいて、生き残った子と死んじゃった子がいたことはけして忘れないと思う