Concurrency
channel: 閉じたchannelへ送信するとpanicになる
close済みのchannelに送信すると、受信のゼロ値とは異なり実行時panicになります。
Sourcesend_after_close.go
Go 1.22
package concurrencyexample
func SendAfterClosePanics() (recovered any) {
values := make(chan int)
close(values)
defer func() {
recovered = recover()
}()
values <- 1
return nil
}Testsend_after_close_test.go
Go 1.22
package concurrencyexample
import "testing"
func Test閉じたChannelへの送信はPanicになる(t *testing.T) {
if got := SendAfterClosePanics(); got == nil {
t.Fatal("SendAfterClosePanics() = nil, want recovered panic")
}
}01Assertion
このテストで確認できること
- channelをcloseした後に値を送信する
- 送信処理がpanicし、recoverで観測できる
channelをcloseする責務は、通常は送信側を一つに絞ります。複数の送信者が残り得る構造でcloseすると送信競合がpanicになり得るため、終了通知と所有者を設計で明示します。
OBSERVED RESULT
close(values)
values <- 1
→ panic: send on closed channel