Порядок событий, которые вызывают это, таков:
- Запуск программы.
- Запись
2
в канал. Емкость канала исчерпана. - Чтение из канала и вывод результата.
- Запись
1
в канал. - Чтение из канала и вывод результата.
Порядок событий, приводящих к этой тупиковой ситуации, таков:
- Запуск процедуры.
- Запись
1
в канал. Емкость канала исчерпана. - Запись
2
в канал. Поскольку буфер канала заполнен, он блокируется.
Вывод, который вы предоставляете, кажется, указывает, что программа завершается первой, а программа не блокируется, что противоречит двум сценариям ios в качестве объяснения. Вот что происходит:
- Запуск программы.
- Запись
2
в канал. - Чтение
2
из канала. - Записать
1
в канал. - Вывод
In f()
. - Вывести
2
, полученный от канала. - Считывание
1
из канала. - Выведите
1
, полученное от канала.
Имейте в виду, что у вас нет никаких гарантий относительно планирования программ, если вы не выполняете их программным образом. Когда вы запускаете программу, она не определена, когда фактически выполняется первый код этой программы и насколько прогрессирует исходный код до тех пор. Обратите внимание, что поскольку ваш код основан на определенном порядке событий, он нарушается этим определением, просто чтобы сказать это явно.
Кроме того, в любой точке вашей программы планировщик может принять решение о переключении между различными программами , Даже одна строка fmt.Printtln(<-c)
состоит из нескольких шагов, и между каждым шагом может происходить переключение.