JavaScriptを有効にしてください

case sendCh<- <-receiveCh: はアンチパターンぽい【Go】

 ·  ☕ 1 分で読めます
Photo by Karolina Grabowska from Pexels

Photo by Karolina Grabowska from Pexels

Goでゴルーチンを使ってコードを書いてるときに、詰まったことがあったのでメモ

問題の症状

caseの中でチャネルの受信と送信を同時にしようとすると、
条件判定の最中にブロックしてしまうことがある

1
2
3
4
5
6
7
8
9
~
for {
	select {
	case <-ctx.Done():
		return
	case sendCh <- <-receiveCh:
		// something
	}
}

具体的には、上記のコードでcontextをcancelしても
case <-ctx.Done():のcaseに入っていかず、
case sendCh <- <-ch:でブロックしてしまった

対策

普通に一回チャネルから受け取ったものを変数に代入してから、チャネルに送り直す

1
2
3
4
5
6
7
8
for {
	select {
	case <-ctx.Done():
		return
	case data := <-receiveCh:
		sendCh <- data
	}
}
共有