Back to questions
VK
Middle
2
В чём отличие буферизованного канала от небуферизованного в Go?
Companies where asked
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 // теперь отправка не блокируется, т.к. есть получатель
Таким образом, буферизованные каналы позволяют более гибко организовывать обмен данными между горутинами без немедленной синхронизации.