Sobes.tech
Назад к вопросам
Middle
1

В чём отличие буферизованного канала от небуферизованного в Go?

Компании, где спрашивали
VKVK

Ответ от нейросети

sobes.tech AI

Буферизованный канал в Go имеет внутренний буфер определённого размера, который позволяет отправителю записывать несколько значений без блокировки, пока буфер не заполнится. Небуферизованный канал не имеет буфера, поэтому отправитель блокируется до тех пор, пока получатель не прочитает значение.

Пример:

ch := make(chan int, 2) // буферизованный канал с буфером на 2 элемента

ch <- 1 // не блокируется, т.к. буфер пуст
ch <- 2 // не блокируется, т.к. буфер ещё не заполнен
// ch <- 3 // блокируется, пока кто-то не прочитает из канала

val := <-ch // чтение из канала

В небуферизованном канале:

ch := make(chan int) // небуферизованный канал

// ch <- 1 // блокируется, пока не будет получателя

go func() {
    val := <-ch
    fmt.Println(val)
}()

ch <- 1 // теперь отправка не блокируется, т.к. есть получатель

Таким образом, буферизованные каналы позволяют более гибко организовывать обмен данными между горутинами без немедленной синхронизации.