Sobes.tech
Back to questions
Middle
2

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

Companies where asked
VKVK

Answer from AI

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 // теперь отправка не блокируется, т.к. есть получатель

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