Материал проходит вычитку — возможны неточности.
Урок 65 из 118

Старт программы

Сергей продолжил урок с того, что первым в программе исполняется не main, а рантайм. На примере демо Миша увидел: когда main возвращается, процесс завершается, не дожидаясь остальных горутин.

Главная мысль

первым в программе исполняется runtime, а не main; и когда main возвращается, процесс завершается, не дожидаясь остальных горутин.

Кто исполняется первым

Запуск Go-программы — не «открыл main и поехали». Первым в дело вступает runtime: он инициализирует свои службы из прошлого урока — аллокатор, планировщик, GC — и только потом вызывает main. Твой func main — не точка входа процесса, а точка входа прикладного кода, которую runtime запускает, когда сам готов.

Выход из main — обрыв

Симметрично и завершение. Когда main возвращается, программа заканчивается: defer из main выполняется, а прочие запущенные горутины — нет, процесс завершается, не дожидаясь их. Подробно эта ловушка разобрана в уроке, где появляются горутины.

В следующем уроке

Вы узнаете:

  • как os.Exit и паника соотносятся с возвратом из main
  • как init() и порядок инициализации пакетов работают
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

В main: go func(){ time.Sleep(100*time.Millisecond); fmt.Println("не успею") }(). Что напечатается?

Вопрос 2 из 3

Кто является точкой входа процесса?

Вопрос 3 из 3

Каков порядок старта и завершения?

Итоги

Сначала runtime, потом main; выход из main обрывает процесс и все горутины. Явное ожидание — только через синхронизацию.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки