Concurrency
channel: buffered channelは容量まで受信者なしで送信できる
buffered channelは空き容量がある間、受信側を待たずに送信を受け付けます。
Sourcebuffered_channel.go
Go 1.22
package concurrencyexample
func SendWithoutReceiver(buffer int) bool {
values := make(chan int, buffer)
select {
case values <- 1:
return true
default:
return false
}
}Testbuffered_channel_test.go
Go 1.22
package concurrencyexample
import "testing"
func TestBufferedChannelは受信者なしでも容量まで送信できる(t *testing.T) {
if SendWithoutReceiver(0) {
t.Fatal("unbuffered channel sent without receiver")
}
if !SendWithoutReceiver(1) {
t.Fatal("buffered channel did not accept value")
}
}01Assertion
このテストで確認できること
- unbuffered channelは受信者なしのselect送信を選べない
- 容量1のchannelは一件の送信を受け付ける
bufferは処理完了の保証ではありません。同期とキューイングを分けて設計します。
OBSERVED RESULT
buffer 0 → send false
buffer 1 → send true