В Go конструкция
select
используется для обработки операций с каналами. Она позволяет горутинам ждать событий на нескольких каналах одновременно. Аналогом конструкции default
в select
является опция, позволяющая избежать блокировки, если ни один из каналов не готов.Когда
select
выполняется, он блокируется до тех пор, пока один из его case-блоков не станет готов к выполнению (т.е. канал не станет доступным для отправки или получения данных). Однако, если добавить блок default
, select
может выполнить его немедленно, если ни один из других case-блоков не готов. Это позволяет избежать блокировки горутины.Мы используем
select
с default
, чтобы выполнить неблокирующие операции с каналами.package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(2 * time.Second)
ch1 <- 1
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- 2
}()
for i := 0; i < 3; i++ {
select {
case val := <-ch1:
fmt.Println("Received from ch1:", val)
case val := <-ch2:
fmt.Println("Received from ch2:", val)
default:
fmt.Println("No channel is ready")
time.Sleep(500 * time.Millisecond)
}
}
}
ch1
и ch2
.select
с default
, который проверяет готовность каналов каждые 500 миллисекунд.default
, выводящий сообщение "No channel is ready".Если вы хотите проверить наличие данных на канале или возможность отправки данных без блокировки, используйте
default
.В некоторых случаях
default
может предотвратить дедлоки, позволяя горутине продолжить выполнение, даже если каналы временно недоступны.Можно использовать
default
для периодической проверки состояния канала или выполнения задач в ожидании готовности каналов.Ставь 👍 и забирай 📚 Базу знаний