Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpChSl 162 of 280 menu
◀ ▶

Выбор готового канала в 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") }

Скажите, что напечатается при запуске.

Скажите, зачем добавляют ветку без ожидания, когда каналы еще пусты.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить