Concurrency
channel: 閉じたchannelの受信はゼロ値とfalseを返す
channelを閉じた後でも受信は直ちに返り、値のゼロ値とok=falseで終了を示します。
Sourceclosed_channel.go
Go 1.22
package concurrencyexample
func ReadAfterClose() (first int, afterClose int, open bool) {
values := make(chan int, 1)
values <- 7
close(values)
first = <-values
afterClose, open = <-values
return first, afterClose, open
}Testclosed_channel_test.go
Go 1.22
package concurrencyexample
import "testing"
func Test閉じたchannelの受信はゼロ値とfalseを返す(t *testing.T) {
first, afterClose, open := ReadAfterClose()
if first != 7 || afterClose != 0 || open {
t.Fatalf("got (%d, %d, %t), want (7, 0, false)", first, afterClose, open)
}
}01Assertion
このテストで確認できること
- close前に送った7は受信できる
- バッファを読み切った後の受信は0とfalseを返す
0が有効なデータになるchannelでは、受信時のokを必ず確認します。range channelはこの終了判定を内部で行います。
OBSERVED RESULT
first receive: 7
after close receive: 0, false