Выбор готового канала в Go
Конструкция ждет сразу несколько каналов и выполняет ту ветку, где отправка или прием могут пройти без блокировки. Если готовы несколько веток, выбор между ними случаен.
Два канала: в одном уже лежит число, второй пуст. Выбор заберет готовое значение:
package main
import "fmt"
func main() {
a := make(chan int, 1)
b := make(chan int)
a <- 1
select {
case v := <-a:
fmt.Println("from a", v)
case v := <-b:
fmt.Println("from b", v)
}
}
На экране "from a 1". Ветка с
b не ждала бы вечно в этом запуске,
потому что a уже готов.
Ветка default срабатывает сразу,
если ни один канал не готов, без
блокировки:
package main
import "fmt"
func main() {
ch := make(chan int)
select {
case v := <-ch:
fmt.Println(v)
default:
fmt.Println("no data")
}
}
Дан следующий код:
fast := make(chan int, 1)
slow := make(chan int)
fast <- 5
Напишите конструкцию с двумя ветками
приема и выведите значение из fast.
Дан следующий код:
ch := make(chan int)
select {
case <-ch:
fmt.Println("got")
default:
fmt.Println("skip")
}
Скажите, что напечатается при запуске.
Скажите, зачем добавляют ветку без ожидания, когда каналы еще пусты.