Требуется ли пропускная способность канала для использования в диапазоне? - PullRequest
1 голос
/ 06 января 2020

Я учусь golang в течение некоторого времени. Я столкнулся с проблемой с каналами. У меня есть 2 примера. Они выглядят одинаково, но 1 из них дает ошибку. Когда я назначаю пропускную способность канала (преобразование в буферизованный канал), проблема решается, но другой пример не имеет назначения пропускной способности.

Это мой первый вопрос.

1-й код https://play.golang.org/p/dbC7ZZsagin

// Creating a channel 
// Using make() function 
mychnl := make(chan string) 

// Anonymous goroutine 
go func() { 
    mychnl <- "GFG"
    mychnl <- "gfg"
    mychnl <- "Geeks"
    mychnl <- "GeeksforGeeks"
    close(mychnl) 
}() 

// Using for loop 
for res := range mychnl { 
    fmt.Println(res) 
} 

2-й код https://play.golang.org/p/yQMclmwOYs9

// We'll iterate over 2 values in the `queue` channel.
queue := make(chan string, 2)
queue <- "one"
queue <- "two"
close(queue)

// This `range` iterates over each element as it's
// received from `queue`. Because we `close`d the
// channel above, the iteration terminates after
// receiving the 2 elements.
for elem := range queue {
    fmt.Println(elem)
}

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

Спасибо, теперь.

1 Ответ

3 голосов
/ 06 января 2020

Ранжирование по каналу не требует его буферизации.

Spe c: отправлять операторы:

Коммуникационные блоки, пока отправка не может продолжить. Отправка по небуферизованному каналу может быть продолжена, если получатель готов.

Ваш второй пример:

queue := make(chan string)
queue <- "one"
queue <- "two"

Если канал queue не буферизован, первая отправка включена он будет блокироваться до тех пор, пока от него не будет готова другая программа. Но в вашем приложении есть только одна процедура, которая будет начинать прием с канала только после посылки: deadlock.

Если буфер имеет значение 2, канал может содержать до 2 значений. Таким образом, отправка двух значений может продолжаться, даже если никто не готов получить от него. Отправка 3-го значения снова заблокирует.

Ваш первый пример работает и с небуферизованным каналом, потому что отправка и получение происходят на 2 одновременных программах.

...