Concurrency
channel: nil channelを含むselect caseは無効になる
nil channelの送受信caseはselectから外れ、defaultがあればdefaultが選ばれます。
Sourcenil_channel.go
Go 1.22
package concurrencyexample
func NilChannelCaseIsDisabled() bool {
var signals <-chan int
select {
case <-signals:
return false
default:
return true
}
}Testnil_channel_test.go
Go 1.22
package concurrencyexample
import "testing"
func TestNilChannelを含むSelectCaseは無効になる(t *testing.T) {
if !NilChannelCaseIsDisabled() {
t.Fatal("nil channel case must not be selected")
}
}01Assertion
このテストで確認できること
- 受信専用のnil channelをselectへ渡す
- channel caseは実行されずdefaultが選ばれる
selectで一時的にcaseを無効化したいときはchannel変数をnilにします。一方でnil channel単独の送受信は永久にブロックするため、初期化漏れの検出にも注意します。
OBSERVED RESULT
var signals <-chan int = nil
select { case <-signals: ... default: ... }
→ default