... почему он не печатает полученное 'выполнено' на терминал?
Это делает - или, скорее, пытается .
Программа Go завершается, когда возвращается основная программа (которая называется main
пакета main
) (или раньше, в некоторых случаях, не встречающихся здесь). Ваш main
возвращается после вызова time.Sleep()
и последующей отправки true
на done
.
Между тем, процедура, находящаяся в цикле for
, пробуждается, когда значение true
поступает в done
канал. Это происходит после того, как основная программа отправила его, после чего основная программа находится в процессе выхода.
Если в этом процессе основная программа занимает достаточно много времени, анонимная программа будет иметь время дляпечать Received 'done'
. Если в этом процессе основной процедуры достаточно быстро, анонимная программа никогда не завершает или, возможно, даже не начинает печатать что-либо, и вы ничего не видите. (Фактический вывод выполняется одним базовым системным вызовом, поэтому вы либо получаете все это, либо ничего из этого.)
Вы можете убедиться, что процедура, которую вы выделили, завершается, прежде чем ваш основной выход завершится любымколичество механизмов, но простейшим, вероятно, является использование sync.WaitGroup
, поскольку он как бы предназначен для этого. Создайте группу ожидания, установите ее счетчик на 1 (добавьте 1 к ее начальному нулю), а затем вызовите функцию Done
на выходе из анонимной программы. Попросите главную программу ожидания подождать.
См. Пример игровой площадки Go .