Почему каналы в go так странно работают?

package main
import "fmt"
  
func main() {
    fmt.Println("Start")
     // создание канала и получение из него данных
    fmt.Println(<-createChan(5)) // блокировка
    fmt.Println("End")
}
func createChan(n int) chan int{
    ch := make(chan int)    // создаем канал
    ch <- n      // отправляем данные в канал
    return ch   // возвращаем канал
}

1.Почему данный код начинает работать, если канал сделать буфферизированным?
2. И почему на буфферизированный канал не работает правило : "Отправителем данных должна быть отдельно запускаемая горутина".
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
Все просто.
1. Если канал без буфера, то при чтении из него программа заблокируется на этом месте, пока кто-то в другой горутине не запишет в этот канал значение. Соответственно, операция записи тоже заблокируется до тех пор, пока кто-то не захочет прочитать из канала.
2. Если канал с буфером и в буфере еще осталось место, то операция записи не заблокируется, а сразу вернет управление. Операция чтения тоже не заблокируется, если в буфере есть какие-то данные. Если же буфер полный, то запись будет вести себя так же как в п1. Если буфер пустой, то чтение будет вести себя так же как в п1.

В вашей программе внутри createChan создается канал и сразу же делается в него запись. Эта запись блокируется в ожидании того, что кто-то прочитает из канала. Но чтение из канала у вас произойдет только при выходе из функции, поэтому программа останавливается навечно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы