こういう特殊なSwitch()の仕様は、やめて欲しい(golang)
go func() {
defer close(done)
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("recv: %s", message)
}
}()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-done:
return
case t := <-ticker.C:
err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
if err != nil {
go func()で、defer close(done)が効いてくるまで、 case <-done:はロックされて、デッドロックになるじゃないか? と、ずっと考えて訳が分からなくなってきたところで、Go言語でチャネルとselect というページに、
チャネルに値が入っていない場合、受信はブロックする。ブロックせずに処理を行いたい場合は select を使う。
そんなSwitchの使いかた、あるかーーーー! と、叫びそうになりました(私の2時間を返せ)