Подтвердить что ты не робот

Golang - Каков размер буфера канала?

Я пытаюсь создать асинхронный канал, и я смотрел http://golang.org/ref/spec#Making_slices_maps_and_channels.

c := make(chan int, 10)         // channel with a buffer size of 10

Что означает, что размер буфера равен 10? Что конкретно означает размер/размер буфера?

4b9b3361

Ответ 1

Размер буфера - это количество элементов, которые могут быть отправлены на канал без блокировки отправки. По умолчанию канал имеет размер буфера 0 (вы получаете это с помощью make(chan int)). Это означает, что каждая посылка будет блокироваться до тех пор, пока другой канал не получит от канала. Канал размера буфера 1 может содержать 1 элемент до отправки блоков, поэтому вы получите

c := make(chan int, 1)
c <- 1 // doesn't block
c <- 2 // blocks until another goroutine receives from the channel

Ответ 2

Следующий код иллюстрирует блокировку небуферизованного канала:

// to see the diff, change 0 to 1
c := make(chan struct{}, 0)
go func() {
    time.Sleep(2 * time.Second)
    <-c
}()
start := time.Now()
c <- struct{}{} // block, if channel size is 0
elapsed := time.Since(start)
fmt.Printf("Elapsed: %v\n", elapsed)

Вы можете играть с кодом здесь.