Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ ενός διαμεσολαβημένου και ενός μη διαμεσολαβημένου καναλιού στο Go;

sobes.tech AI

Απάντηση από 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 // теперь отправка не блокируется, т.к. есть получатель

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