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

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

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

Войти через центр авторизации
Похожие вопросы
21 окт. 2019, в 22:35
500 руб./за проект
21 окт. 2019, в 21:56
10000 руб./за проект