Буфер канала в 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", выведите приемом
и напечатайте результат.
Скажите, когда отправка в канал с буфером все равно ждет читателя.