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

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

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

Войти через центр авторизации
Похожие вопросы
Gadsbee Казань
от 80 000 до 150 000 ₽
Level Travel Москва
от 130 000 до 200 000 ₽
Disco Москва
от 180 000 ₽
05 июл. 2020, в 10:19
600 руб./в час
05 июл. 2020, в 10:05
500 руб./за проект