Default в select
Ключевое слово default в конструкции select
позволяет выполнить код, если ни один из каналов не готов
к отправке или получению данных. Это делает операцию
неблокирующей. В первом параметре мы передаем каналы для
чтения или записи, во втором параметре мы указываем
действие по умолчанию, которое выполнится, если ни один
канал не готов.
Синтаксис
select {
case <-ch1:
// Действие при получении из ch1
case ch2 <- val:
// Действие при отправке в ch2
default:
// Действие, если ни один канал не готов
}
Пример
Давайте создадим небуферизированный канал и попробуем
получить из него данные с использованием default:
package main
import "fmt"
func main() {
ch := make(chan int)
select {
case val := <-ch:
fmt.Println("Received:", val)
default:
fmt.Println("No data available")
}
}
Результат выполнения кода:
"No data available"
Пример
Давайте попробуем отправить данные в канал, который не имеет получателя:
package main
import "fmt"
func main() {
ch := make(chan int)
select {
case ch <- 42:
fmt.Println("Sent: 42")
default:
fmt.Println("Cannot send, no receiver")
}
}
Результат выполнения кода:
"Cannot send, no receiver"
Пример
Давайте рассмотрим ситуацию, когда один из каналов готов
к операции, и default не выполняется:
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 100
select {
case val := <-ch:
fmt.Println("Received:", val)
default:
fmt.Println("No data available")
}
}
Результат выполнения кода:
"Received: 100"
Пример
Давайте используем default для неблокирующей
проверки нескольких каналов:
package main
import "fmt"
func main() {
ch1 := make(chan int)
ch2 := make(chan string)
select {
case val := <-ch1:
fmt.Println("From ch1:", val)
case msg := <-ch2:
fmt.Println("From ch2:", msg)
default:
fmt.Println("No data from any channel")
}
}
Результат выполнения кода:
"No data from any channel"