[БЕЗ_ЗВУКА] А теперь рассмотрим, каким образом можно дождаться окончания работы нескольких горутин, кроме использования каналов, конечно. В первом видео, как вы помните, я использовал функцию Scanln() из пакета fmt для того, чтобы дождаться какого-то ввода из консоли. Это удобно для демонстрации во время курса, однако не подойдёт для применения в реальной работе. Там дожидаться нужно каким-то другим образом. Для этого в Go в пакете sync есть специальная структура, называется WaitGroup(). WaitGroup() — это довольно простая вещь. Вы добавляете туда в счётчик какое-то количество worker'ов либо ещё чего-то, что будет уменьшаться в процессе работы, а после этого вы говорите: wg — в данном случае так называется моя wait-группа, wait, то есть «подожди, пока этот счётчик не уменьшится в ноль». Давайте посмотрим ещё детальнее. Смотрите, я создал ссылку на wait group. В связи с реализацией эту структуру не надо копировать после создания, то есть всегда создавайте её по указателю. Теперь я начинаю запускать свои горутины. Перед запуском горутины я обязательно кладу её в wait-группу, то есть делаю wg.Add(1). Почему это нужно сделать там, где вы запускаете горутину, а не в самой горутине, что вроде бы было бы логично? Дело в том, что горутина может не запуститься до того, как завершится цикл. Она может уже после этого начать выполняться. А я при этом дойду до wg.Wait(), и увижу, что там ещё никого нет, и завершу работу. Это будет немножко не то, что вы ожидаете. Поэтому добавлять в wait-группу нужно там, где вы запускаете корутину, перед запуском её. Итак, я добавил что-то, добавил единицу в wait-группу, запустил worker. Внутри worker'а я сразу же делаю defer, отложенный вызов, и вызываю функцию, вызываю метод Done у структуры WaitGroup. Метод Done просто уменьшает счётчик внутри. Через defer, через отложенное выполнение я знаю, что я выполню его в любом случае, когда моя горутина завершится. Таким образом, когда worker отрабатывает своё, выполняется wg.Done(), счётчик уменьшается на единицу, и в итоге сходится к нулю. Давайте посмотрим, как это работает. Хотя ничего нового вы не увидите по сравнению с первой программой. [ЗВУК] [ЗВУК] Смотрите, отработали все наши горутины, и программа автоматически завершилась, без того чтобы я нажимал какую-то клавишу. Это называется WaitGroup.