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

Буфер канала в Go

Второй аргумент при создании задает длину буфера. Пока в очереди есть свободные места, отправка не ждет читателя; прием по-прежнему ждет, если буфер пуст.

С буфером на два элемента положим два числа подряд, затем заберем оба:

package main import "fmt" func main() { ch := make(chan int, 2) ch <- 10 ch <- 20 fmt.Println(<-ch) fmt.Println(<-ch) }

На экране 10 и 20. Третья отправка без приема уже заблокировала бы main, потому что буфер заполнен.

Буфер удобен, когда отправитель ненадолго обгоняет получателя, но размер нужно подбирать осмысленно: слишком большой буфер скрывает, что читатель отстает:

package main import "fmt" func main() { ch := make(chan string, 1) ch <- "first" fmt.Println(<-ch) }

Дан следующий код:

ch := make(chan int, 2) ch <- 1 ch <- 2 ch <- 3

Скажите, на какой отправке программа остановится в ожидании.

Создайте канал строк с буфером 1, положите "go", выведите приемом и напечатайте результат.

Скажите, когда отправка в канал с буфером все равно ждет читателя.

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