Golangのチャネルブロッキングの問題をどのように解決しますか?
Go言語では、チャネルのブロッキング問題は以下のように解決できます:
- 選択する
- 選択する (sentaku suru)
- 選択する
select {
case <-ch1:
// 执行ch1通道的读操作
case <-ch2:
// 执行ch2通道的读操作
default:
// 所有通道都没有准备好
}
- 選択する
- 時間の経過
- 選択する
select {
case <-ch:
// 执行ch通道的读操作
case <-time.After(time.Second):
// 超时处理
}
- バッファ付きチャネルを使用すると、チャネルのバッファには一定数の要素を保存することができ、送信操作がバッファが満杯でない場合はすぐに実行され、ブロックされません。バッファが満杯の場合、送信操作は要素が読み取られるまでブロックされます。バッファ付きチャネルを使用することで、送信操作時にブロックされることを回避できます。
ch := make(chan int, 10) // 带有缓冲区大小为10的通道
ch <- 1 // 发送操作不会阻塞
- れん
- キャップ
- れん
- 帽子
if len(ch) < cap(ch) {
ch <- 1
}
選択した方法は、特定のシーンやニーズに応じて適切なものです。